1.4 http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html中存在双重检查问题 在后来的 JDK 中修复了吗?
问问题
818 次
2 回答
8
一个简单的谷歌显示
- 如果以特定方式使用,它在 Java 5 中已修复(请参阅 Marko 的回答)
- 它仍然不是一个好主意。通常一个简单
enum
的就是更好的解决方案。
而不是写
public final class Singleton {
// Double-check idiom for lazy initialization of instance fields.
private static volatile Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
Singleton result = instance;
if (result == null) { // First check (no locking)
synchronized (Singleton.class) {
result = instance;
if (result == null) // Second check (with locking)
instance = result = new Singleton();
}
}
return result;
}
}
你可以写
public enum Singleton {
// Thread safe lazy initialization of instance field.
INSTANCE
}
于 2012-11-19T10:03:36.660 回答
4
不,它没有修复,也不会修复。Java 5 刚刚明确指出这个习语被打破了,这是最终的判决。懒惰地初始化实例字段的正确方法涉及另一个类似称为习语的方法:双重检查习语:
// Double-check idiom for lazy initialization of instance fields.
private volatile FieldType field;
FieldType getField() {
FieldType result = field;
if (result == null) { // First check (no locking)
synchronized(this) {
result = field;
if (result == null) // Second check (with locking)
field = result = computeFieldValue();
}
}
return result;
}
参考:Josh Bloch,Effective Java。另请参阅对 Josh Bloch 的 Oracle technetwork 采访。
于 2012-11-19T10:11:17.553 回答