单例模式学习总结

1. 参考资料

  1. 单例模式-伯乐在线

2. 知识点理解

  1. 定义:系统运行中有且仅有一个实例
  2. 示例代码:
    public class Singleton {  
        private Singleton() {}                     //关键点0:构造函数是私有的
        private static Singleton single = null;    //关键点1:声明单例对象是静态的
        private static object obj= new object();
        public static Singleton GetInstance()      //经过静态方法来构造对象
        {                        
             if (single == null)                   //关键点2:判断单例对象是否已经被构造
             {                             
                lock(obj)                          //关键点3:加线程锁
                {
                   if(single == null)              //关键点4:二次判断单例是否已经被构造
                   {
                      single = new Singleton();  
                    }
                 }
             }    
            return single;  
        }  
    }
  3. 注意点
    • 构造函数必须为private
    • 单例对象必须声明为静态:外部静态调用
    • 构造单例对象以前要加锁(lock一个静态的object对象)
    • 须要两次检测单例实例是否已经被构造,分别在锁以前和锁以后 Double Check lock
    • 枚举类 Instance 实现单例,InstanceEnum.Instance调用
  4. 关键问题
    1. 为什么要检测两次?有可能延迟加载或者缓存缘由,形成构造多个实例,违反了单例的初衷。
    2. 构造函数可否公有化?不行,单例类的构造函数必须私有化,单例类不能被实例化,单例实例只能静态调用
    3. lock住的对象为何要是object对象,能够是int吗?不行,锁住的必须是个引用类型。若是锁值类型,每一个不一样的线程在声明的时候值类型变量的地址都不同,那么上个线程锁住的东西下个线程进来会认为根本没锁,至关于每次都锁了不一样的门,没有任何卵用。而引用类型的变量地址是相同的,每一个线程进来判断锁多想是否被锁的时候都是判断同一个地址,至关因而锁在通一扇门,起到了锁的做用。
相关文章
相关标签/搜索