CASとABAの問題

      CASは、揮発性がJUCパッケージは、基本的な同期を実現しています。同期に偏っロックは、ロック機構の下でリリースされ、軽量ロックの獲得は、キューが完了し、営業チームにスレッドを取得するために障害がCASロックフラグを操作された後、取得、解放をロック状態。

CASプロセス

     CASシステムは、一連の命令から成るシステムプリミティブであり、比較、すなわち、スイッチングを比較およびスワップ表し、単にアトミック動作はCAS操作である、分割することができません。sun.misc.unsafeクラスでは、すべてのメソッドは、ネイティブです、このようなダイレクトメモリ操作などの適切なタスクを実行するための基礎となるオペレーティングシステムリソースへの直接呼び出しを、持っている、CASの操作でのJavaの実行は安全でない方法でクラスに依存します。このアルゴリズムは、核となるアイデアで、次のようです

3つのパラメータが含まれています

  • V(すなわち、メモリ内の変数の現在の値)を更新する変数を表します

  • Eは期待値を表し、

  • Nは、新しい値を表し

       、我々は目標値Eを提供する必要がCAS動作は、Eは== V、それはスレッドが値を変更しないことを示す場合、現在のスレッドは、Nのように変更してもよいが、現在のスレッドが期待値と一致しない場合、その値は、別のスレッドによって変更されています(また、スピンと呼ばれる)、その後の更新操作を実行しませんが、再読み込み、変数に選択して、変数を変更して再度お試しすることができ、あなたはまた、操作を中止することができます。

ABAの問題CAS

      いくつかのCASが小さいオーバーヘッド同期して動作する必要があるかもしれないが完了しているが、スピンの過剰消費の同時実行の問題の大量の下で、このようなABAの問題などいくつかの問題が、あります。ABAの問題について、例:

 

       私はいくつかの理由で、支払いは二つのスレッド1と2を開始し、何かを買うために100元を支払います。スレッド1がAのマイアカウントメモリードルの値に期待され、Bは-100元作るように変更しました。

       次いで、ブロックされたスレッド1、スレッド2の変化Bの実装を成功させます (メモリの値BがAの期待値によってそれに等しくないので、通常、CASスレッド1は、故障しました)

       スレッド1は、実行を継続するのに十分な時間ではありません、あなたは私が$ 100に転送し、転送スレッド3が正常に終了与え、私の口座100は、元になりました。

       転送が完了したスレッド3の後、スレッド1は最終的に始めた、それはメモリAの値が、それはデビット操作を実行することが分かりました。私は$ 100失う理由はありません。

 

、同じ2つのスレッドが唯一の成功した操作を持っていることになっていたかが、第三者の介入と後者の二つによって、2つの実行、混乱してスレッド間でデータを変更する:簡単に言えば、ABAの質問です2つのスレッドが同じ操作の成功を行います。このような二回控除のお金のように!

      解決策は私にバランス値を加えたバージョン番号、および変更更新されたバージョンの後を与えることです。いくつかのケースでは、バージョン番号==値メモリ、バージョン番号の期待値は、両方のは、更新操作まで、ようにしたいとこと。

       

        

おすすめ

転載: www.cnblogs.com/shen-qian/p/11238999.html