返回信息流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不就多余了吗?麻烦大神指导一下啊,多谢多谢
这是一条镜像帖。来源:北邮人论坛 / java / #48368同步于 2016/3/8
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
单例模式DCL volatile
hhbb
2016/3/8镜像同步16 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
不是多余的。如果不是volatile的,有可能别的线程看到uniqueInstance已经不是null了,却同时看到该对象里面的成员还没有初始化。
不是太理解,麻烦暖神再说详细一点,多谢了
【 在 nuanyangyang 的大作中提到: 】
: 不是多余的。如果不是volatile的,有可能别的线程看到uniqueInstance已经不是null了,却同时看到该对象里面的成员还没有初始化。
沙发说的是对的。貌似在哪本书上看到过。但是我仔细想了想,有感觉没必要。引用的赋值都是原子操作,如果不是null了,构造函数和所有的instance initializer应该全部执行完毕了才对,应该不会有成员未初始化的情况。具体细节我也不是很清楚。不过保险起见,还是建议使用volatile,虽然我现在都不写。。
【 在 hhbb 的大作中提到: 】
: 不是太理解,麻烦暖神再说详细一点,多谢了
看看这个吧: http://bbs.byr.cn/#!article/Java/41136
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() {}
: ...................
嗯,暖神给的答案很好
【 在 a206206 的大作中提到: 】
: 沙发说的是对的。貌似在哪本书上看到过。但是我仔细想了想,有感觉没必要。引用的赋值都是原子操作,如果不是null了,构造函数和所有的instance initializer应该全部执行完毕了才对,应该不会有成员未初始化的情况。具体细节我也不是很清楚。不过保险起见,还是建议使用volatile,虽然我现在都不写。。
多谢,解释的很好
【 在 nuanyangyang 的大作中提到: 】
:
: 看看这个吧: http://bbs.byr.cn/#!article/Java/41136
嗯,多谢
【 在 aiquestion 的大作中提到: 】
: wiki上有另一种方法,据说是best practice。
: 感觉是利用Java本身的类加载来做。
: 找到了:https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom
: ...................