2

私が求めていることを示すために必要な最良の例は、シングルトンパターンです

public class Singleton {     
     private static Singleton instance = new Singleton();     

     private Singleton() {     
     }     

     public static Singleton getInstance() {
          return instance;    
     } 
}

このコードでは、Singleton インスタンスへのポインターを取得するための同期の必要性を回避するために、静的変数が導入されています。これがどのように起こるかを知る方法はありますか?静的はどのように実装されていますか?

4

2 に答える 2

4

静的フィールドは、複数のスレッドが同時に初期化しないように、クラスがロードされるときに初期化されます。その仕組みの詳細については、JLS 12.4.2を参照してください。コードでは、staticそのクラスのロード後にフィールドの値を設定するものは他にないため、クラスのロード時にインスタンス化された値のみが保持されます。

フィールドをマークすることで、これをより明確にすることができます/する必要があります (コードの変更に関しては、将来的に保証されます) final。これはおそらく、JLS による完全なスレッド セーフにも必要です (ただし、実際には問題にはなりません)。


わずかな独り言: 上記の段落の「クラスのロード」は実際には「クラスのインスタンス化」であり、実際には JLS で定義されているようにロード後に発生するステップです。これを「ロード」と呼んで、静的フィールドのインスタンス化と明確に区​​別できるようにしました。クラスのロードはクラスの初期化における 1 つのステップにすぎませんが (上記の JLS 12.4 で定義されているように)、プロセス全体が一般的な用語で「クラスのロード」に短縮されることがあります。

于 2013-10-25T14:53:01.157 に答える
1

クラスの静的プロパティは、クラスが jvm によってロードされるときにロードされます。これは、実行時に 1 回だけ発生するためです。静的プロパティは一度だけ作成されることが保証されています。

于 2013-10-25T14:49:31.903 に答える