われわれが知っているように、シンプルなダブルチェックには、JVMが使用するコマンドのために問題があります。ダブルチェック付きのJavaシングルトン
class MyClass {
private String Name;
private static Object o = new Object();
private static MyClass Instance=null;
private MyClass(){
//Thread.sleep(1000);
Name="test case";
}
public static MyClass GetInstance(){
if(Instance==null){
synchronized(o){
if(Instance==null){
Instance = new MyClass();
//MyClass obj = new MyClass();
//Instance = obj;
}
}
}
return Instance;
}
}
私がInstance = new MyClass();
をコメント行に置き換えた場合。これは機能しますか?
いいえ、ちょうど['volatile']にします(https://en.wikipedia.org/wiki/)。 Double-checked_locking#Usage_in_Java)。 –
MyClass obj = new MyClass();新しいインスタンスが返され、インスタンスにオブジェクトが割り当てられます。これが機能しないのはなぜですか?私は本当に理由を知らないのです。 –
'volatile'を使って正しく実装しても、ダブルチェックロックはほとんどありません。レイジーインスタンス化されたシングルトンは、[オンデマンドホルダーイディオムの初期化](https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom)を使用する必要があります。 – Radiodef