シングルトンに関するウィキペディアの記事には、Javaで構造を実装するためのスレッドセーフな方法がいくつか記載されています。私の質問のために、長い初期化プロシージャを持ち、一度に多くのスレッドによってアクセスされるシングルトンを考えてみましょう。スレッドセーフなJavaのシングルトン
まず、この言及されていないメソッドはスレッドセーフであるかどうか、もしそうであれば、それはどのように同期するのですか?
public class Singleton {
private Singleton instance;
private Singleton() {
//lots of initialization code
}
public static synchronized Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
第2に、次の実装のスレッドは初期化時に安全で怠惰なのはなぜですか? 2つのスレッドが同時にgetInstance()
メソッドに入るとどうなりますか?
public class Singleton {
private Singleton() {
//lots of initialization code
}
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
最後に、第2の例では、どのような一つのスレッドが最初のインスタンスを取得し、別のスレッドがインスタンスを取得し、コンストラクタは、最初のスレッドで終了する前に、それに対してアクションを実行しようとすると?あなたは危険な状態になりますか?
この記事を読んだ後、静的なフィールドを読み込むときにJavaが「内部」同期を行うということを修正しましたか? – donnyton
_ "このパターンはシングルトンに使用するパターンです。" _ - [有効なJavaの列挙シングルトン](http://stackoverflow.com/questions/427902/java-enum-singleton)についてはどうですか? –
enum singleton IMHOは、このようにきれいではっきりと分かりません。したがって、MyClass.getInstance()は、シングルトンの業界標準です。シングルトンこのパターンには適切なAPI *と適切な実装が実装されています。 – Bohemian