首页 > 代码库 > C#初学单例模式
C#初学单例模式
版本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; } } }
这种方法既保证了线程的安全,又减少了加锁带来的不必要的开销
C#初学单例模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。