BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #48368同步于 2016/3/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

单例模式DCL volatile

hhbb
2016/3/8镜像同步16 回复
public class Singleton { private volatile static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance() { if (uniqueInstance == null) { synchronized (Singleton.class) { if (uniqueInstance == null) { uniqueInstance = new Singleton(); } } } return uniqueInstance; } } 对这个单例模式中的volatile的作用不是很理解。我的理解是volatile在这里面可以保证uniqueInstance里面的值是最新的同主内存是一致的,但是有了synchronized同步块了,即使uniqueInstance不是volatile的,也可以确保在同步块内uniqueInstance值是最新的,那这样,volatile不就多余了吗?麻烦大神指导一下啊,多谢多谢
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nuanyangyang机器人#1 · 2016/3/8
不是多余的。如果不是volatile的,有可能别的线程看到uniqueInstance已经不是null了,却同时看到该对象里面的成员还没有初始化。
hhbb机器人#2 · 2016/3/9
不是太理解,麻烦暖神再说详细一点,多谢了 【 在 nuanyangyang 的大作中提到: 】 : 不是多余的。如果不是volatile的,有可能别的线程看到uniqueInstance已经不是null了,却同时看到该对象里面的成员还没有初始化。
a206206机器人#3 · 2016/3/9
沙发说的是对的。貌似在哪本书上看到过。但是我仔细想了想,有感觉没必要。引用的赋值都是原子操作,如果不是null了,构造函数和所有的instance initializer应该全部执行完毕了才对,应该不会有成员未初始化的情况。具体细节我也不是很清楚。不过保险起见,还是建议使用volatile,虽然我现在都不写。。
nuanyangyang机器人#4 · 2016/3/9
【 在 hhbb 的大作中提到: 】 : 不是太理解,麻烦暖神再说详细一点,多谢了 看看这个吧: http://bbs.byr.cn/#!article/Java/41136
ml3615556机器人#5 · 2016/3/9
进来学习
aiquestion机器人#6 · 2016/3/9
wiki上有另一种方法,据说是best practice。 感觉是利用Java本身的类加载来做。 找到了:https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom public class Example { private static class StaticHolder { static final MySingleton INSTANCE = new MySingleton(); } public static MySingleton getSingleton() { return StaticHolder.INSTANCE; } } 【 在 hhbb 的大作中提到: 】 : public class Singleton { : private volatile static Singleton uniqueInstance; : private Singleton() {} : ...................
hhbb机器人#7 · 2016/3/9
嗯,暖神给的答案很好 【 在 a206206 的大作中提到: 】 : 沙发说的是对的。貌似在哪本书上看到过。但是我仔细想了想,有感觉没必要。引用的赋值都是原子操作,如果不是null了,构造函数和所有的instance initializer应该全部执行完毕了才对,应该不会有成员未初始化的情况。具体细节我也不是很清楚。不过保险起见,还是建议使用volatile,虽然我现在都不写。。
hhbb机器人#8 · 2016/3/9
多谢,解释的很好 【 在 nuanyangyang 的大作中提到: 】 : : 看看这个吧: http://bbs.byr.cn/#!article/Java/41136
hhbb机器人#9 · 2016/3/9
嗯,多谢 【 在 aiquestion 的大作中提到: 】 : wiki上有另一种方法,据说是best practice。 : 感觉是利用Java本身的类加载来做。 : 找到了:https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom : ...................