package SingletonPattern; //双重检查锁机制的单例模式,在JDK1.5之后,双重检查锁定才能够正常达到单例效果 public class Demo5 { //volatile确保了instance的内存可见性,即当前线程在使用(use)自己工作内存中的instance的前一步, // 都会从主内存中刷新load(对应的read会发生在load前)一遍,确保此时是最新的值, //但在这里必要的不是这个功能,因为synchronized能够保证可见性 //这里必要的是volatile禁止了指令重排序 private static volatile Demo5 instance; private Demo5(){ } public static Demo5 getInstance(){ if (instance == null){ //instance空时进入同步块,非空时,不需要同步 synchronized (Demo5.class){ //如果同步块内没有这层检查,则假设当两个线程同时调用时,都会进入同步块,一个执行,一个阻塞 //当执行线程离开同步块,阻塞线程拿到锁进入同步块,又实例化了一次 if (instance == null){ instance = new Demo5();//创建对象可以分解为如下的3行伪代码 // memory=allocate(); 1:分配对象的内存空间ctorInstance(memory); // ctorInstance(memory); 2:初始化对象instance=memory; // instance=memory; 3:设置instance指向刚分配的内存地址 // 若不禁止指令重排序,可能会导致先3后2,实例化还没做完,就提前先把instance赋值了 // 此时其他线程调用方法得到的实例可能是不完整的,使用时就会出错 System.out.println("实例化!"); } } } return instance; } public void dosomething(){ System.out.println("我是Demo5"); } }
双重检测锁定的单例模式讲解
最新推荐文章于 2024-02-05 21:03:27 发布