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、EffectiveJavaJoshBlochとのこのOracletechnetworkインタビューも参照してください。

于 2012-11-19T10:11:17.553 に答える