Table of Contents
スレッドセーフである単調パターンを設計することは、複数のスレッドが同時にインスタンスを作成することを試みる場合でも、クラスが存在するインスタンスだけを確保するために、マルチスレッドセーフなアプリケーションでは不可欠です。 この記事では、スレッドセーフな単調パターンを実装するための最良のプラクティスと共通テクニックについて説明します。
シングルトンパターンを理解する
単行パターンは、クラスを単一のオブジェクトにインスタンス化する制限をします。データベース接続や設定設定の設定などの共有リソースを管理するためによく使われます。複数の環境では、ネイブシングルトンの実装は複数のインスタンスにつながり、パターンの目的を破ることができます。
多面的な環境での課題
複数のスレッドがインスタンスを同時に作成しようとすると、レース条件が起こります。適切な同期がなければ、複数のスレッドはインスタンスチェックを渡すことができ、複数のオブジェクトを作成できます。スレッドの安全を確保すると、このレース条件を防ぐ戦略が組み込まれています。
ダブルチェックロック
この技術は、ロックを必要とする前に既に存在するインスタンスが既に存在するかどうかをチェックすることで、同期オーバーヘッドを削減します。 2つのチェックが含まれます。同期ブロックの外側と1つの内側の1つです。 適切な実装では、指示の順序を防止するために揮発性変数が必要です。
例(Java):
[プライベート静的揮発性単調インスタンス;]
public静的シングルトン getInstance() {
の場合 (インスタンス == null) {
同期 (単調) {]
の場合 (インスタンス == null) {
[] インスタンス = new Singleton();
〔FLT:0〕
〔FLT:0〕
〔FLT:0〕
返すインスタンス;
}
初期化オンデマンドホルダーIdiom
このアプローチは、クラスローディング機構を活用して、明示的な同期なしでスレッドの安全を確保します。 シングルトンインスタンスは、必要に応じてロードされるネストされた静的クラス内で保持されます。
例(Java):
プライベート静的クラスホルダー {[
[] 静的最終シングルトンインストランス = 新しいシングルトン();]
}
public静的シングルトン getInstance() {
返しホルダー.INSTANCE;[
}
スレッドの安全のためのベストプラクティス
- シンプルさと効率性のために、初期化オンデマンドホルダーのidiomを使用してください。
- シングルトンインスタンスが、ダブルチェックロックを使用している場合は、揮発性を宣言されていることを確認してください。
- パフォーマンスを向上させるために不要な同期を避けてください。
- 多読条件下で単調実装を徹底的にテストします。
コンテンツ
スレッドセーフなシングルトンパターンを実装するには、同期技術の慎重な考慮が必要です。 初期化オンデマンドホルダーのidiomは、クリーンで効率的なソリューションを提供しています。ダブルチェックロックは、適切な揮発性の使用に柔軟性を提供します。 最良のプラクティスに従うと、マルチスレッドアプリケーションで信頼性の高いシングルトン動作を保証します。