1

「EffectiveJava、Second Edition」の項目71では、インスタンスフィールドを遅延インスタンス化するために、ダブルチェックイディオムとシングルチェックイディオムが導入されています。

イディオムを再確認する

private volatile FieldType field;
FieldType getField() {
  FieldType result = field;
  if (result == null) {
    synchronized(this) {
      result == field;
      if (result == null)
        field = result = computeFieldValue();
    }
  }
  return result;
}

シングルチェックイディオム

private volatile FieldType field;
FieldType getField() {
  FieldType result = field;
  if (result == null) {
    field = result = computeFieldValue();
  }
  return result;
}

ダブルチェックのイディオムであるJoshuaは、結果変数を使用して、揮発性フィールドが1回だけ読み取られるようにし、パフォーマンスを向上させると述べています。これは理解できますが、とにかくフィールドを1回しか読み取らないため、シングルチェックイディオムでなぜそれが必要なのかわかりません。

4

2 に答える 2

5

シングルチェックのイディオムでは、結果変数がないと、2回読み取ることになります。1回はnullチェック用、もう1回は戻り値用です。

于 2012-12-20T21:46:54.967 に答える
0

私は遅延評価の次の実装を好みます:

@ThreadSafe
class MyClass {
    private static class MyClassHelper {
       public static final MyClass helper = new MyClass();
    }

    public static MyClass getInstance() {
        return MyClassHelper.helper;
    }
}
于 2012-12-20T21:59:59.457 に答える