3

「二重チェックのロックが壊れている」宣言を読みました。でも、関数でオブジェクトを作ってもいいのかな?

    class Foo { 
      private Helper helper = null;
      public Helper getHelper() {
        if (helper == null) 
          synchronized(this) {
            if (helper == null) 
              helper = createHelper();
          }    
        return helper;
      }
      private Helper createHelper() {
         return new Helper();
      }
      // other functions and members...
    }
4

1 に答える 1

5

いいえ、関数を追加しても違いはありません。そして、あなたの機能は何もしていません。

ただし、それを宣言するとvolatile、Java 1.5から動作し始めます

private volatile Helper helper = null;

Java での遅延初期化の正しい方法の 1 つは、Initialization-on-demand holder idiom です。これは、内部クラスが参照されるまでロードされないという事実に依存しています。

class Foo {
    private static class HelperHolder {
        public static Helper helper = new Helper();
    }

    public static Helper getHelper() {
        return HelperHolder.helper;
    }
}
于 2012-10-11T06:32:44.620 に答える