private volatile Demo01 demo01;
// 创建对象不是原子操作
// new #2 申请新空间
// dup
// invokespecial #3 执行构造函数
// astore_1 然后将demo01和新空间连起来。
// return
// 如果不加volatile astore_1 可能就会重排到invokespecial前面的,这时对象还没创建好,但是demo01已经不是null了。会直接返回demo01;
public Demo01 getDemo01() {
if (demo01 == null) { // 有对象就直接返回不要获取锁了
synchronized (this) {
if (demo01 == null) { // 获取到锁不一定是第一个获取的,前面获取到的先创建了你就不要创建了。
return demo01 = new Demo01(1);
}
}
}
return demo01;
}
DCL单例必须要加volatile的原因
最新推荐文章于 2024-06-18 16:29:42 发布