06 CASの原則とAQS

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

    ロックダウングレード:データが変更された後に書き込みロックを解除しないで、直接、書き込みロックを獲得するスレッドが、最初に読み取りロック解除書き込みロックを取得し、最後に読み込みロックを解除する必要があります。

おすすめ

転載: www.cnblogs.com/lifeone/p/11653147.html