CASの原則
交換アルゴリズムを比較CAS(コンペア・アンド・スワップ)は、全くロック原子ではありません。
CAS(値、期待して、newValueに) 、 vauleとecpectは、それがnewValueにに更新されている場合、または何もしない、falseを返します
原則
unsafe.compareAndSwapInt仮想マシンで(この、valueOffset、期待して、更新)、ローカルメソッド呼び出しプロセスと基盤となるオペレーティングシステムを呼び出すことによって操作
CASの問題によって引き起こされます
- サイクル時間が長すぎると
、そうでない場合はロックが絶えず循環されます長く、非常に大規模なCPUオーバーヘッドもたらすための
ソリューションを:CASのスピンの数を制限JUC、SynchronousQueueのようにBlockingQueueの - 共有変数は、アトミック性を保証することができる
使用可能なロック、共有変数の複数の - ABAの問題
Aの元の値が、Bとなり、その後、Aになったとき、あなたは何の変化も気付かないだろうが、これはABAの問題であり、時間のCASチェックの上に、実質的に変更されました。
解決策:あなたはAtomicStampedReferenceを使用し、時間を加えたバージョン番号を変更します
AQS
自己定義のロックを達成するためのヘルパークラスでロックを取得し、ロックを解除するための機能のテンプレートを提供します。
排他ロック | 共有ロック |
---|---|
(INTフラグ)を取得し 、オブジェクト排他モードを取得するために割り込みを無視 |
acquireShared(int型引数)は、 割り込みを無視して、共有モードで取得します |
tryAcquire(引数) 排他モードで獲得しようとし |
tryAcquireShared(INTのarg) 共有モードで獲得しようとし |
リリース(int型引数) 排他モードで解放 |
releaseShared(int型引数) 共有モードで解放 |
JDKのロックを提供
- ReentrantLockの(サポート再入国ロック、公正かつ不当なロックをロック)
- ReentrantReadWriteLock
ロックダウングレード:データが変更された後に書き込みロックを解除しないで、直接、書き込みロックを獲得するスレッドが、最初に読み取りロック解除書き込みロックを取得し、最後に読み込みロックを解除する必要があります。