单例模式——双检锁

作者:追风剑情 发布于:2017-8-12 16:07 分类:C#

  1. using System;
  2. using System.Threading;
  3.  
  4. namespace Test1
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. }
  11. }
  12.  
  13. public sealed class Singleton
  14. {
  15. private static Object s_lock = new Object();
  16.  
  17. // 这个字段引用一个单例实例对象
  18. private static Singleton s_value = null;
  19.  
  20. // 私有构造器阻止这个类外部的任何代码创建实例
  21. private Singleton()
  22. {
  23. //把初始化单实例对象的代码放在这里...
  24. }
  25.  
  26. // 以下公共静态方法返回单实例对象(采用双检锁技术,Double-Check Locking)
  27. public static Singleton GetSingleton()
  28. {
  29. if (s_value != null) return s_value;
  30.  
  31. Monitor.Enter(s_lock);
  32. if (s_value == null)
  33. {
  34. //编译器可能会这样做:
  35. //1.为Singleton分配内存并把引用发布给temp
  36. //2.最后执行Singleton的构造器
  37.  
  38. //所以如果这样写s_value=new Singleton();那么
  39. //其他线程可能拿到一个尚未执行构造器的s_value对象。
  40. Singleton temp = new Singleton();
  41.  
  42. //Volatile保证了Singleton构造器执行结束后,才把引用发布到s_value
  43. Volatile.Write(ref s_value, temp);
  44. }
  45. Monitor.Exit(s_lock);
  46.  
  47. return s_value;
  48. }
  49. }
  50. }


lock(obj){ }Monitor 的语法糖。类似如下代码:

try
{
	Monitor.Enter(obj);
	dosomething();
}
catch(Exception ex)
{
	
}
finally
{
	Monitor.Exit(obj);
}


官方文档:Volatile类

标签: C#

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号