0

1.4 http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html中存在双重检查问题 在后来的 JDK 中修复了吗?

4

2 回答 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 回答