单例模式双重验证锁

 

 沒有将变量设置成volatile,会有下面问题:

new是操作不说原子性的,他包含操作:

1,分配内存地址,allocate memory

2,初始化对象, initialize object

3,将引用变量指向内存,make referent variable point to memory

由于jvm的重排列re-order问题,会将2和3调转,导致沒有完成初始化就使用而有epx

加了volatitle禁止了重排列,导致了再获得对象前,都会被阻塞在同步代码块中。

所以核心问题就是:在初始化时候同步了,而沒有在修改操作中同步。

引申问题:一个变量在不同的同步块中是不会同步的。

 

posted on 2019-12-21 09:47  Kooing  阅读(794)  评论(0编辑  收藏  举报

导航