单例模式的双重锁为什么要加volatile(转)

单例模式如下:

 

 需要volatile关键字的原因是,在并发情况下,如果没有volatile关键字,在第5行会出现问题。

instance = new TestInstance();可以分解为3行伪代码

a.memory = allocate() //分配内存

b. ctorInstanc(memory) //初始化对象

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

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

 

 

转自:单例模式的双重锁为什么要加volatile

posted @ 2019-09-30 00:31  何其小静  阅读(2255)  评论(0编辑  收藏  举报