【发布时间】:2011-03-26 19:07:55
【问题描述】:
让我们看看经典的双重检查
class Foo {
private volatile Foo singleton = null;
public Foo getFooSingleton() {
if (singleton == null) {
synchronized(this) {
if (singleton == null)
singleton = new Foo();
}
}
return singleton;
}
}
Volatile modifire 保证“singleton”变量的值将在所有线程中正确显示。但是在当前示例中我真的需要这个吗? 我想不是。所以 - 这就是我认为这个程序以最糟糕的方式运行的方式 - 当一个线程所做的更改不被其他线程看到时。
- 线程一进入同步部分并创建单例
- 线程二进入同步,同步其当前堆栈值(现在他看到
singleton != null),进行第二次检查并退出同步部分。
所以。即使没有 volatile 声明,一切都可以正常工作,甚至更好 =)
【问题讨论】:
-
我的猜测是,如果
singleton不再设置为null,你可能是对的。 -
我认为您错过了 Java 内存模型不是顺序一致的。也就是说线程可以看到不同顺序的字段读写(如果没有正确同步)。
-
嗯,你的意思是同步块中没有顺序一致?
-
不,您不需要 volatile,因为您的“单例”没有任何需要安全发布的状态。由于您的对象没有状态,因此您也不需要单例。由于您的对象没有方法,因此您实际上不需要这里的类。事实上,整个问题毫无意义。
标签: java algorithm concurrency synchronization