シリーズ3 | |高い同時実行のJavaのコア要素は、ABAの問題|原則の基本的な実装をロック

CASアルゴリズムは、我々が知っている最後の記事、CASアルゴリズム基礎となる実装は、原子CPUの命令によって達成される、と言って続けています。

だから、ここに1つのシナリオは次のとおりです。

言葉は、一つは、位置Aに、メモリからの場合、別のスレッドは、2つの除去、及びBに二つにいくつかの操作を実行されるメモリ位置V Aから取られた糸、ひいては2つのVデータを有します一つのスレッドが操作を実行し、この時間は、CASは、その後、メモリAにまだ成功した一つの操作であることがわかりました。
CASスレッド1操作の成功にもかかわらず、これは、プロセスが問題ではないことを意味するものではありません。
なぜあなたは言うのですか?のは、このシナリオを想像してみましょう:

あなたは非常にのどが渇いている場合は、あなたが水で満たされたカップを見つけ、あなたが飲み込みます。後カップを与えるために水を再充填します。そして、あなたは残して、または水で満たされたカップを見て、彼は確かに人が戻ってカップの再充填真のマスターを飲んでいるかどうか知りませんでした。今回、質問が来ました。これは、水のガラスの前にコップ一杯の水ではありません。おじさんの言葉では、あなたの叔父やあなたの叔父が、あなたはあなたの叔母おばさんはそうではありません!

ABAは、どのようにこの問題を解決するには?

答えは:バージョン番号。

共有データ領域内のバージョン番号を追加するときにバージョン番号が一致している場合、各スレッドの変化は、比較のために、前のバージョン番号を思い付くためになされるべきです、则进行修改,并将版本号+1(当然加多少或减多少都是可以自己定义的)。

実際には、このような飼育係として、デザインのアイデア、のデータの一貫性を維持することが非常に重要であり、また、データの一貫性を維持するために、このメカニズムを使用していました。

ABAの問題を解決するために、偉大なjavaのは私たちにAtomicMarkableReferenceとAtomicStampedReferenceクラスを提供します。

または背面上の例に飲む、あなたがプログラマであれば、その後、所有者は例の良いベースフレンズのちょうどあなたのカップで、彼はその後、「0」の上に書かれた、紙コップにリリースされる、あなたは、水を飲んでいます「1」から「0」、そしてあなたの良いベースが友人を見に戻って来て、あなたは彼のガラスを味わってきました知っています。この時間は、彼はそれがあなたとのテスト、「ベース状況」で、飲むことではなかったです!

以下は、プレゼンテーションでAtomicStampedReferenceの関連するコードを使用します:

 

おすすめ

転載: www.cnblogs.com/gyc567/p/11019559.html