マルチスレッド同時プログラミングのメモ 03 (XiaoDi Classroom) --- スレッド セーフ

 

 

 アトミックな操作:

そんなコードです。

出力してみましょう:

結果は私たちが期待していたものではないことがわかりました。

通常は 1000 が出力されるはずです。

これは、原子性が保証されていないためです。

それでは、原子性を追加してみましょう。

これにより原子性が保証されます。

次に、このキーワードについて詳しく説明します。

 

 

 両方のインスタンス オブジェクトを同時に出力していることがわかりました。

したがって、通常のメソッドを変更すると、クラスではなくインスタンス オブジェクトがロックされることがわかります。

静的メソッドを変更する: クラス全体を変更する

静的メソッドを呼び出します。

 

今回は、最初のスレッドのメソッドが実行され、2 番目のスレッドのメソッドは、最初のスレッドのスリープが終了した後にのみ実行されます。

 コードブロックを装飾します。

 変更されたコード ブロックもオブジェクト インスタンスをロックします。同期された括弧内のオブジェクトです

揮発性キーワードと使用シナリオ:

 

 シングルトンとスレッドの安全性:

お腹を空かせた中華風:

 

Hungry スタイル自体はスレッドセーフであるため、ロックなどの操作を行う必要はありません。

怠け者のスタイル:

時間のかかるシナリオで遅延シングルトン パターンをシミュレートしました。

返されるシングルトン インスタンス オブジェクトはそれぞれ異なることがわかりますが、これは私たちが望むシングルトン効果ではありません。

このことから、私たちの遅延単純な書き込みメソッドがスレッドセーフではないこともわかります。

 

返されたメソッドに synchronized キーワードを追加して、再度実行するだけです。

これにより、スレッドの安全性が確保されます。

 ただし、この書き方はメソッドをロックするため最善の方法とは言えず、複数のスレッドがある場合、他のスレッドがすぐにこのメソッドを呼び出すことができず、時間もかかります。

synchronized キーワードを別の場所に追加して、二重検証を実行できます。

 

ただし、Java では命令が再配置される状況があるため、怠け者にとって最高のスレッド セーフを実現するには、次の 1 段階の変更を行う必要があります。

volatile キーワードをクラスに追加すると、命令の再配置を回避できます。

スレッドの安全性の問題を回避する方法:

 

おすすめ

転載: blog.csdn.net/weixin_52618349/article/details/129765862