アトミックな操作:
そんなコードです。
出力してみましょう:
結果は私たちが期待していたものではないことがわかりました。
通常は 1000 が出力されるはずです。
これは、原子性が保証されていないためです。
それでは、原子性を追加してみましょう。
これにより原子性が保証されます。
次に、このキーワードについて詳しく説明します。
両方のインスタンス オブジェクトを同時に出力していることがわかりました。
したがって、通常のメソッドを変更すると、クラスではなくインスタンス オブジェクトがロックされることがわかります。
静的メソッドを変更する: クラス全体を変更する
静的メソッドを呼び出します。
今回は、最初のスレッドのメソッドが実行され、2 番目のスレッドのメソッドは、最初のスレッドのスリープが終了した後にのみ実行されます。
コードブロックを装飾します。
変更されたコード ブロックもオブジェクト インスタンスをロックします。同期された括弧内のオブジェクトです
揮発性キーワードと使用シナリオ:
シングルトンとスレッドの安全性:
お腹を空かせた中華風:
Hungry スタイル自体はスレッドセーフであるため、ロックなどの操作を行う必要はありません。
怠け者のスタイル:
時間のかかるシナリオで遅延シングルトン パターンをシミュレートしました。
返されるシングルトン インスタンス オブジェクトはそれぞれ異なることがわかりますが、これは私たちが望むシングルトン効果ではありません。
このことから、私たちの遅延単純な書き込みメソッドがスレッドセーフではないこともわかります。
返されたメソッドに synchronized キーワードを追加して、再度実行するだけです。
これにより、スレッドの安全性が確保されます。
ただし、この書き方はメソッドをロックするため最善の方法とは言えず、複数のスレッドがある場合、他のスレッドがすぐにこのメソッドを呼び出すことができず、時間もかかります。
synchronized キーワードを別の場所に追加して、二重検証を実行できます。
ただし、Java では命令が再配置される状況があるため、怠け者にとって最高のスレッド セーフを実現するには、次の 1 段階の変更を行う必要があります。
volatile キーワードをクラスに追加すると、命令の再配置を回避できます。
スレッドの安全性の問題を回避する方法: