class MyClass
{
private static volatile Resource resource;
public static Resource getInstance()
{
if(resource == null)
resource = new Resource();
return resource;
}
}
揮発性の安全な発行が行われると(つまり、参照が別のスレッドから参照できるようになるとすぐに、データも利用可能です)、実際にはJavaの同時実行性に従います。だから私はここでそれを使うことができますか?しかし、それが正しければ、今度はthread1が "リソース"をチェックし、それがヌルなので、オブジェクトの作成を開始するとします。スレッド1がobjetを作成している間に別のスレッド、すなわちthread2が来て、 "resource"の値のチェックを開始し、thread2がそれをnullとして見つけます( "resource"オブジェクトの作成はかなりの時間がかかります)。安全なパブリケーションがスレッド2に利用できないために発生していない)、オブジェクトの作成も開始されますか?そうであれば、クラス不変のブレーク。私は正しいですか?この特別な揮発性の使用をここで理解するのを助けてください。シングルトンが揮発性である場合
シングルトンでは「volatile」は使用しません。 *定義によると、シングルトン内のプライベートインスタンスは変更されません。つまり、スレッドが古い値をキャッシュする危険はありません。これはあなたの 'getInstance'が同期されていないため、スレッドセーフではない実装を現在持っています。 Javaでシングルトンを作成するには、 'enum'を使います。 –
http://jeremymanson.blogspot.com/2008/11/what-volatile-means-in-java.html – happybuddha
ほぼすべての用途で、クラスローディングが遅れて行われるため、初期化式を使用することもできます。おそらくこのインスタンスを使用せずに(他の何らかの理由で)クラスを使用している場合、静的なクラスを入れ子にしてもうまくいくでしょう。 –