标签:指令重排序 zed mem gets log 初始化 ret 伪代码 总结
(1)双重校验锁
public class Singleton { private volatile static Singleton singleton; private Singleton (){} public static Singleton getSingleton() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
1)构造函数和对象私有化
2)对象用violate和static关键字修饰
3)公有的静态获取对象方法
4)双重校验锁
violate关键字作用:防止指令重排序
创建对象可以分解为如下的3行伪代码
memory=allocate(); //1:分配对象的内存空间
ctorInstance(memory); //2:初始化对象
instance=memory; //3:设置instance指向刚分配的内存地址
上面3行代码中的2和3之间,可能会被重排序导致先3后2
(2)静态内部类
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
1)对象用static和final修饰
2)对象由静态类包裹
标签:指令重排序 zed mem gets log 初始化 ret 伪代码 总结
原文地址:http://www.cnblogs.com/shinning/p/6058372.html