请列出来
具体来说,一般是两种:懒汉式和饿汉式。懒汉式模式如下,不会主动创建单例,在类第一次使用的时候创建单例:
public class single{private static single instance = null;
private single() {}
synchronize public static single getInstance(){if(instance == null){instance = new single();}return instance;}}
饿汉式模式如下,加载类的同时创建单例:
public class single{private static single instance = new instanc();
public static single getInstance(){return instance;}}
只要掌握了思想就好了啊。具体的实现可以根据需求的不同来调整啊。。
难道说.Net framework给提供了什么比较方便的接口?
加一个双检索方式,对于多线程访问时控制:
public class Singleton{private static Singleton _instance;
private Singleton(){}static object obj = new object();public static Singleton GetInstance(){
if (_instance == null){lock (obj){
if (_instance == null){_instance = new Singleton();}}}
return _instance;}
}
有很多种写法,主要是要保证单线程构造实例
方法一:声明时构造
public class Singleton{// 在创建类型时创建,CLR保证类型创建时是单线程private static readonly Singleton _instance = new Singleton();private Singleton() {} // 构造器私有
public static Singleton GetInstance() { return _instance; }}
方法二:类型构造器时构造
static Singleton() {_instance = new Singleton(); // 与上一种写法一致}
private Singleton() {} // 构造器私有
方法三:在需要时构造
public class Singleton{private static readonly object _objLock = new object();private static Singleton _instance;
public static Singleton GetInstance() {
lock(_objLock) {if(_instance == null) {_instance = new Singleton();}}
return _instance;}}
方法四:在需要时构造,对方法进行单线程控制
[MethodImpl(MethodImplOptions.Synchronized)]public static Singleton GetInstance() {// 确保只有单线程来控制示例,但是需要保证别的地方不会被调用if(_instance == null) {_instance = new Singleton();}
相对而言,方法一与方法二是最安全的方式,当然了,也可以用锁或者别的线程控制方式来保证单一线程的安全性。
其次就是方法3了,好处就是只在调用GetInstance来创建实例,减少构建开销。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(4)
具体来说,一般是两种:懒汉式和饿汉式。
懒汉式模式如下,不会主动创建单例,在类第一次使用的时候创建单例:
public class single
{
private static single instance = null;
private single() {}
synchronize public static single getInstance()
{
if(instance == null)
{
instance = new single();
}
return instance;
}
}
饿汉式模式如下,加载类的同时创建单例:
public class single
{
private static single instance = new instanc();
private single() {}
public static single getInstance()
{
return instance;
}
}
只要掌握了思想就好了啊。具体的实现可以根据需求的不同来调整啊。。
难道说.Net framework给提供了什么比较方便的接口?
加一个双检索方式,对于多线程访问时控制:
public class Singleton
{
private static Singleton _instance;
private Singleton()
{
}
static object obj = new object();
public static Singleton GetInstance()
{
if (_instance == null)
{
lock (obj)
{
if (_instance == null)
{
_instance = new Singleton();
}
}
}
return _instance;
}
}
有很多种写法,主要是要保证单线程构造实例
方法一:声明时构造
public class Singleton
{
// 在创建类型时创建,CLR保证类型创建时是单线程
private static readonly Singleton _instance = new Singleton();
private Singleton() {} // 构造器私有
public static Singleton GetInstance() { return _instance; }
}
方法二:类型构造器时构造
public class Singleton
{
private static Singleton _instance;
static Singleton() {
_instance = new Singleton(); // 与上一种写法一致
}
private Singleton() {} // 构造器私有
public static Singleton GetInstance() { return _instance; }
}
方法三:在需要时构造
public class Singleton
{
private static readonly object _objLock = new object();
private static Singleton _instance;
private Singleton() {} // 构造器私有
public static Singleton GetInstance() {
lock(_objLock) {
if(_instance == null) {
_instance = new Singleton();
}
}
return _instance;
}
}
方法四:在需要时构造,对方法进行单线程控制
public class Singleton
{
private static Singleton _instance;
private Singleton() {} // 构造器私有
[MethodImpl(MethodImplOptions.Synchronized)]
public static Singleton GetInstance() {
// 确保只有单线程来控制示例,但是需要保证别的地方不会被调用
if(_instance == null) {
_instance = new Singleton();
}
return _instance;
}
}
相对而言,方法一与方法二是最安全的方式,当然了,也可以用锁或者别的线程控制方式来保证单一线程的安全性。
其次就是方法3了,好处就是只在调用GetInstance来创建实例,减少构建开销。