Javaスレッドの安全性の基礎

著作権:オリジナルの作品は、ソースを明記してください掲載しました!https://blog.csdn.net/sa19861211/article/details/90313525

1.同期

JMM約2同期の条項:

  1. スレッドが共有変数の値のロックを解除する前に、メインメモリに最新の更新でなければなりません
  2. スレッドロックは、共有変数を使用する際に、メインメモリから必要と、ワーキングメモリの変数の共有値をクリアします
    最新の値を再取得する(注意:ロックとロック解除のニーズが同じロックされている)
    2点以上によると、あなたが見ることができます可視性を実現するために同期させることができます。一方、同期以降に同期して、それは原子であるロック。
    結論:同期には、視認性を解決するだけでなく、原子性を解決するだけでなく、

2.ロック

2.1 ReentrantLockのリエントラントロック
プリアンブルコードでは解放されなければならない、または入力したことがない他のスレッドを起こし、ロックが解除される原因となることができることはありませんロックする必要があるが、ロックの最後に忘れてはいけません。
ReentrantReadWriteLock 2.2
ReentrantReadWriteLockそのコアが独立した読み取りで、特に読書と以下の書き込みの場合には、高い同時アクセス時にロックを書き、パフォーマンスはリエントラントロックよりもはるかに高いです。
その本質は、2つのロック、読み込みと書き込みロックに分かれています。読み取りで複数のスレッドが同時にアクセスすることができますロック、しかしとき書き込みロック、1回のシーケンシャルアクセスによる一つだけ。
ルール:、共有を読んで読み書き相互に排他的で、相互に排他的な書き込み。

3.揮発性

volatileキーワードの役割は、むしろ読書でワーキングメモリのスレッドに比べて、変数を読みに行くためにメインメモリ(共有メモリ)にスレッドを強制することです。可視スレッドセーフを満たすために、すなわち、目に見える複数のスレッド間で変数を実現することはありません。
結論:揮発性のアドレスのみの可視性は、アトミックを解決していません。

4.アトミックアトミッククラス

例えば:のAtomicInteger、AtomicLongは...
アトミック操作をサポートしていますが、唯一の原子自体の方法は、アトミック複数の動作を保証するものではないことを保証します。

5. ThreadLocalの

ローカル変数をスレッド、それは変数への同時アクセスの間に、マルチスレッドのソリューションです。
その同期例えば、ThreadLocalの完全にロックが設けられていないロッキングのような方法が、時間空間への器具の使用とは異なり、スレッドの安全性を確保するために、スレッドごとに独立変数のコピーを提供します。
パフォーマンスから、ThreadLocalのは絶対的な優位性を持っていない、と述べました。同時ではパフォーマンスが良くなるロック、非常に高いではありませんが、ロックのセットとしてThreadLocalのを使用して、大量の同時または競争力のあるシーンでは完全に無関係なスレッドセーフな解決策は、ある程度のロックに減少させることができます競争。

6.ロックの最適化

ロック最適化は、以下の原則に従ってください:

  • 例えば、非ロック操作を利用します。アトミック操作(アトミック*シリーズタイプ)、および揮発性のキーワードを。
  • 保持時間ロックを削減
  • 減少したロックの粒度
  • ロックを分離する(書き込みロック)
  • デッドロックを回避

おすすめ

転載: blog.csdn.net/sa19861211/article/details/90313525