第一次写博客,写的不好休怪哈。
版本1:最简单的单例模式
方法一:
public class MySingleton { private MySingleton() //构造函数,注意private { } private static MySingleton _Entity = null; //私有字段 public static MySingleton Entity //公共属性 { get { if (_Entity == null) //确保只能创建一次对象 { MySingleton._Entity = new MySingleton(); } return MySingleton._Entity; } } }
方法二:
public class MySingleton { private MySingleton() //构造函数,注意private { } private static MySingleton _Entity = null; //私有字段 public static MySingleton GetEntity() //公有方法 { if (_Entity == null) //确保只能创建一次对象 { MySingleton._Entity = new MySingleton(); } return MySingleton._Entity; } }
两点:1)保证所有构造函数不被外部所调用;2)利用属性或者方法调用对象。
缺点:无法保证线程的安全性,多个线程的情况下可能创建多个对象。
版本2:线程安全的单例模式
public class MySingleton { private MySingleton() //构造函数,注意private { } private static readonly object obj = new object(); private static MySingleton _Entity = null; //私有字段 public static MySingleton Entity //公共属性 { get { lock (obj) //确保同一时刻,加锁的代码段只能被一个线程执行 { if (_Entity == null) //确保只能创建一次对象 { MySingleton._Entity = new MySingleton(); } } return MySingleton._Entity; } } }
缺点:无论对象是否已经被创建,都要进行加锁,增加了不必要的开销。
版本3:Double-Checked Locking
public class MySingleton { private MySingleton() //构造函数,注意private { } private static readonly object obj = new object(); private static MySingleton _Entity = null; //私有字段 public static MySingleton Entity //公共属性 { get { if (_Entity == null) //第一次检验,用于减少不必要的加锁 { lock (obj) //确保同一时刻,加锁的代码段只能被一个线程执行 { if (_Entity == null) //第二次检验,确保只能创建一次对象 { MySingleton._Entity = new MySingleton(); } } } return MySingleton._Entity; } } }
这种方法既保证了线程的安全,又减少了加锁带来的不必要的开销。
时间: 2024-10-09 22:07:21