私はJavaでシングルトンクラスを実装して、クラスのインスタンスを2つ以上作成していないことを確認しています。シングルトンクラスをスレッドセーフにする方法は?
答えて
おそらく、最善の方法は、単一のインスタンスで列挙型を使用することです。これにはシリアライズ可能でシリアン化とリフレクションに対するシングルトン性が保証されていますが、シンプルなシングルトン実装はありません(プライベート?私はリフレクションを持っています。
デフォルトでは、シングルトンはスレッドセーフではありません。シングルトンを作成する一般的な方法は、1つのインスタンスの作成を処理するファクトリメソッドを持つことです。そうすれば、インスタンスの作成を制御できます。
public class Singleton {
public static final Singleton INSTANCE = new Singleton();
private Singleton() { ... }
}
静的インスタンス変数を使用する方が、内部の "Holder"クラスよりも優先されます。もしあなたが好きなら、静的メンバをprivateにして、それにアクセスするためのメソッドを提供することもできますが、スタックに別のメソッド呼び出しを追加するだけです。
これはむしろ、何が望ましいかによって異なります。ホルダーはあなたに怠惰なシングルトンを与えますが、単純なバージョンでは怠惰な読み込みができません。 –
はい、そうです。 Javaは、最初に使用されるまでクラスをロードしません。 –
完全に真実ではありません。最初に参照されたときに読み込みます。別のクラスのメソッドシグネチャに追加します。 – skaffman
lazy instanciationについて:getInstance()は、シングルトンを返します。最初の呼び出しであれば、シングルトンを返します。
public class MySingleton
{
private static MySingleton instance;
private MySingleton()
{
// construct object . . .
}
// For lazy initialization
public static synchronized MySingleton getInstance()
{
if (instance==null)
{
instance = new MySingleton();
}
return instance;
}
// Remainder of class definition . . .
}
レイジーインスタンス化はほとんど必要ありませんが、そうであれば、Javaはクラスを遅延ロードします。したがって、宣言でインスタンスを実際に作成する*遅延レイジングはありません(非常にまれなケースですが、 。 –
この実装は、インスタンスへの参照を取得するすべての試行を同期します。ほとんどのコードは次のようになります: Singleton.getInstance.doSomething(); Singleton.getInstance.doSomethingElse(); 全体の効果は、メンバのアクセス/突然変異の点でスレッドの安全性が保証されていないため、同時同期が大幅に同時実行を制限することになります。 –
javaでのダブルチェックロックが壊れているhttp://www.javaworld.com/jw-0220001/jw-0209-double.html 要するに、このクラスが一度しかインスタンス化されないことを保証するこの方法は、並行性の問題を見つけるのは困難です。これを決して使用しないでください。 – Buhb
シングルトンを作る最良の方法は?列挙型を使用します。
public enum Singleton {
INSTANCE;
public void foo(){ ... }
}
// Usage:
Singleton.INSTANCE.foo();
VMの助けを借りて、二重インスタンス化を避けるだけでなく、逆シリアル化の破損を避けることもできます。
同時実行性を気にしている場合、共有グローバル状態は使用されません。
シングルトンが特異並列化された問題からの結果の蓄積を保持するのであれば、なぜですか?シングルトンはグローバルな状態を表しており、公正な使用シナリオになります。 –
プロセス間で共有されるインスタンスが1つのみで表されるクラスには、いくつかのユースケースがあります。Springを使った典型的なよく設計されたWebアプリケーションは、たぶん、ワーカースレッド間で共有されるシングルトンスコープでインスタンス化された一連のクラスを持つでしょう。 – Buhb
- 1. スレッドセーフな方法は、
- 2. シングルトンクラスを保存/ロードする方法
- 3. 2.7 Pythonコンテキストマネージャをスレッドセーフにする方法
- 4. シングルトンクラスで "self"を使ってインスタンスメソッドにアクセスする方法は?
- 5. pybind11を使ってシングルトンクラスをラップする方法は?
- 6. シングルトンクラスでマップを実装する方法は?
- 7. Unityで一般的なシングルトンクラスを作成する方法は?
- 8. Swift:シングルトンクラスからViewControllerにあるCollectionViewにアクセスする方法
- 9. スレッドセーフなイベントハンドラを作成する方法
- 10. このコードをスレッドセーフにする方法はありますか?
- 11. スレッドセーフな方法はV4L2ですか?
- 12. メソッド全体をスレッドセーフにする最も簡単な方法は?
- 13. 原子をスレッドセーフな方法で初期化するには?
- 14. VB.netスレッドセーフな方法でリストビューのサブアイテムを追加するには?
- 15. スレッドセーフJavaでシングルトンパターンを効率的に実装する方法は?
- 16. スレッドセーフな方法でC++ 03でプログラムを終了するには?
- 17. スレッドセーフな方法でC#WPFコントロールにアクセスするには?
- 18. シングルトンクラスは
- 19. スタティック対シングルトンクラスの動作方法(データベース)
- 20. SWIFT 3.0でのシングルトンクラスの作成方法
- 21. シングルトンクラスを使用してjsonデータを解析する方法
- 22. スカラ - スレッドセーフな方法で
- 23. SwingWorkerのスレッドセーフ - スレッドセーフな方法でJTableを更新
- 24. シングルトンクラスを使用する最も効率的な方法
- 25. オーチャードテーマでC#シングルトンクラスを使用する方法
- 26. 循環キューを完全にスレッドセーフにする方法
- 27. UNITY:スレッドセーフなContainer.Resolve()関数をコンストラクタインジェクションで実装する方法は?
- 28. シングルトンクラス
- 29. オブジェクトをWPFコントロールのスレッドセーフにバインドする方法
- 30. Realm内のオブジェクトを適切にスレッドセーフで削除する方法
+1アクセス修飾子での嘲笑。私は笑った。 :) – corsiKa