ダブルチェックロック、NetBeansは私を混乱させますか?
-
29-10-2019 - |
質問
ダブルチェックロックに関するクエストがあります。この例を考えてみましょう。
public class Singleton {
private static volatile Singleton instance = null;
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance ;
}
}
私が理解したように、上記のコードはシングルトンクラスを作成する正しい方法です。
ただし、NetBeansは私に外側のIFステートメントを削除することを望んでいるので、次のようになります。
public class Singleton {
private static volatile Singleton instance = null;
public static Singleton getInstance() {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
return instance ;
}
}
これらの2つのスニペットの唯一の違いは、2番目の例では、コードが常に同期ブロックに入り、最初はそうではないことです。なぜNetBeansを聴き、外側のIFステートメントを削除するのですか?ロックを避ける方が良いはずです。
解決
NetBeansの自動ヒントシステムは、明らかに正しく再チェックされたロックを行うことができることを認識していません volatile
, 、あなたがやったように、それは代わりに完全なロックを示唆しています。転ばぬ先の杖。しかし、あなたはこの場合、NetBeansではなく正しいです。
他のヒント
ほとんどの場合、シングルトンは使用され、作成するのにそれほど費用がかかりませんので、単純にするだけです。
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
public static Singleton getInstance() {
return INSTANCE;
}
...
}
本当に怠zyなインスタンス化が必要な場合は、静的な内部クラスを使用してください。
public class Singleton {
public static Singleton getInstance() {
return Holder.INSTANCE;
}
...
private static class Holder {
private static final Singleton INSTANCE = new Singleton();
}
}
この状況では、NetBeansを聞かないでください。最初のコードサンプルは正しいです。
所属していません StackOverflow