龙空技术网

Java 单例模式的双重锁为什么要加volatile

小七随笔 395

前言:

而今小伙伴们对“单例模式双重锁写法”大体比较注意,同学们都想要知道一些“单例模式双重锁写法”的相关资讯。那么小编也在网络上搜集了一些有关“单例模式双重锁写法””的相关内容,希望兄弟们能喜欢,看官们快快来了解一下吧!

public class SingletonInstance { private volatile static SingletonInstance instance = null; public static SingletonInstance getInstance(){ if(instance == null){ //1 synchronized (SingletonInstance.class){ //2 if(instance == null){ //3 instance = new SingletonInstance(); //4 } } } return instance; //5 }}

需要volatile关键字的原因是,在并发情况下,如果没有volatile关键字,在第5行会出现问题。instance = new SingletonInstance();可以分解为4行伪代码

memory = allocate() //分配内存

ctorInstanc(memory) //初始化对象

instance = memory //设置instance指向刚分配的地址

上面的代码在编译运行时,可能会出现重排序从a-b-c排序为a-c-b。在多线程的情况下会出现以下问题。当线程A在执行第5行代码时,B线程进来执行到第2行代码。假设此时A执行的过程中发生了指令重排序,即先执行了a和c,没有执行b。那么由于A线程执行了c导致instance指向了一段地址,所以B线程判断instance不为null,会直接跳到第6行并返回一个未初始化的对象。

标签: #单例模式双重锁写法