Volatile による二重チェック ロック
二重チェック ロック パターンは、シングルトン オブジェクトのみが作成されるようにするために Java で使用される一般的な手法です。一度。このパターンでは、新しいインスタンスを作成する前に、シングルトンのインスタンスがすでに存在するかどうかを確認します。ただし、適切に同期しないと、複数のスレッドが同時にシングルトンを作成しようとする競合状態が発生する可能性があります。
この問題に対処するには、volatile キーワードが使用されます。 volatile キーワードを使用すると、1 つのスレッドがインスタンス変数を変更した場合でも、インスタンス変数がすべてのスレッドに表示されるようになります。これにより、スレッドが部分的に構築されたインスタンスを参照できなくなります。
Volatile の使用法の説明
指定されたコード例では、インスタンス変数は volatile として宣言されています。複数のスレッド間で共有されます。スレッド A がインスタンス変数を初期化するとき、それにメモリ空間を割り当てます。ただし、スレッド B はこの割り当てを確認し、スレッド A が構築を完了する前にインスタンスを使用しようとする可能性があります。
volatile キーワードがなければ、スレッド B はインスタンスへの割り当てを確認できますが、その後の構築は確認できません。これにより、スレッド B が部分的に構築されたインスタンスを使用することになり、エラーが発生します。 volatile キーワードにより、スレッド B がインスタンスの最新の値を参照できるようになります。これには、スレッド A によって加えられた変更も含まれます。
パフォーマンスの問題への対処
volatile を使用すると、不必要な同期を回避してパフォーマンスを向上させるという二重チェック ロックの目的が損なわれると主張する人もいるかもしれません。ただし、スレッドの安全性を保証し、競合状態を防ぐには、volatile の使用が不可欠です。
実際には、volatile を使用することによるパフォーマンスのオーバーヘッドは、特にメソッド全体の同期にかかるコストと比較すると、通常は無視できます。最新のハードウェア アーキテクチャでは、揮発性変数への書き込みがタイムリーに他のスレッドに表示されるようにするメモリ バリアが実装されています。
以上が二重チェックされたロックで Volatile を使用すると、シングルトン作成時のスレッドの安全性の問題は解決しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。