1

次のコードを検討してください。

   // This code safely publishes the Publishable object
   public static Publishable publishable= new Publishable();

カスタム Publishable オブジェクトを公開するこのような方法を見たことがありますが、これは安全であると読みました。私の質問は:

  1. これは本当に安全な公開方法ですか?
  2. 1 に対する答えが「いいえ」の場合、その理由は? はいの場合、理由も説明してください。
4

3 に答える 3

7

JCiPによると:

静的初期化子は、クラスの初期化時に JVM によって実行されます [...] このメカニズムは、この方法で初期化されたオブジェクトを安全に公開することが保証されています。

参照: JLS 12.4.2 - 項目 9:

次に、クラスのクラス変数初期化子と静的初期化子、またはインターフェイスのフィールド初期化子のいずれかを、単一のブロックであるかのように、テキストの順序で実行します。

于 2012-07-03T10:22:46.177 に答える
3

静的ブロックから実行されるか、静的に初期化されるすべてのコードは、スレッド セーフです。

できればフィールドをファイナルにします。

 public static final Publishable publishable= new Publishable();

または、Publishable を列挙型にすることもできます

 public enum Publishable {
      INSTANCE;

 }
于 2012-07-03T10:24:11.490 に答える
1

これは、このオブジェクトを初期化するのに特に良い方法だとは思いません(「安全」という言葉は別として、さまざまな方法で解釈できます)。

含まれているクラスに関連付けられたシングルトンを作成しており、初期化は制御されていません。というか、そのクラスがロードされるとすぐに初期化されます。それを完全に制御できますか?

私はむしろ:

  1. シングルトンを使用しないでください。シングルトンを使用することの難しさの詳細については、こちらを参照してください。あなたの質問にはスレッド関連のキーワードがタグ付けされており、シングルトンはスレッドに関する独自の問題を引き起こしていることに注意してください。
  2. クライアント クラスがこのオブジェクトの初期化を制御できるようにします。このオブジェクトの初期化を延期したい場合があります (突然重いオブジェクトになったり、構築時にネットワーク呼び出しを実行したりする場合を想像してください)。現在、上記ではこれをほとんど制御できません。
于 2012-07-03T10:24:32.633 に答える