站点微信订阅号zhengjinyibu,欢迎大家搜索关注.
volatile关键字不但可以防止指令重排,也可以保证线程访问的变量值是主内存中的最新值
完整版 双重校验单例模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class Singleton { private Singleton() {} private volatile static Singleton instance = null; public static Singleton getInstance() { if (instance == null) { synchronized (this){ if (instance == null) { instance = new Singleton(); } } } return instance; } }
|
期望的执行顺序:
1 2 3
| memory =allocate(); //1:分配对象的内存空间 ctorInstance(memory); //2:初始化对象 instance =memory; //3:设置instance指向刚分配的内存地址
|
如果不加volatile 关键字,那么,就会发生指令重排序.出现下面的情况.
1 2 3
| memory =allocate(); //1:分配对象的内存空间 instance =memory; //3:设置instance指向刚分配的内存地址 ctorInstance(memory); //2:初始化对象
|
volatile关键字不但可以防止指令重排,也可以保证线程访问的变量值是主内存中的最新值
本文内容仅作为作者个人兴趣与观点,不代表所在公司及团队的观点和决策。若有不恰当之处,请联系站长.