CASの原則

CASは、比較、コンペア・アンド・スワップの略で、為替は、Javaのアトミック性を確保するための重要な方法で、楽観的ロックの実装です。

これは、先に古い値の一歩を取得する必要があり、その後、現在の値を比較する方法を入力してください古い値と同じで、同じならば、そのデータを更新する、またはメソッドを終了し、ただのアクションを繰り返します。したがって、CAS法は、非閉塞です。CASの方法は、変数のメモリ値、古いデータの更新値の期待値を3つのパラメータが必要です

CASの擬似コードは次のように表すことができます。

行う{

  古いデータをバックアップ取得します。

  データを更新する準備ができました。

}ながら(!CAS(メモリアドレス、古いデータのバックアップ、新しいデータ))


 

プライベート 静的 最終的な安全でない危険= Unsafe.getUnsafe()。
プライベート 静的 最終 長い valueOffset。
    / ** 
     *原子的には、指定された更新値に値を設定
     電流値{場合* @code ==}期待値。
     * 
     * @paramは期待値が期待する
     * @param 新値更新
     * @return { @code 成功した場合は、trueを}。偽の復帰はあることを示し
     、実際の値が期待値に一致しませんでした*。
     * / 
    パブリック 最終 ブールのcompareAndSet(intは、期待INTの更新){
         戻り unsafe.compareAndSwapIntを(この、valueOffset、期待して、更新); 
    }

上記原子のAtomicIntegerクラスの部分的な源である、JavaはCAS動作に見ることができる安全でないパケットのクラスの下太陽によって実現され、クラスメソッドが安全でないネイティブメソッドは、ローカルJVMによって実現されます。

そして、単に関連OpenJDKのソースを見つける見つけるためにオンラインに行く、それはアトミックを呼び出す:os_cpuでのホットスポットの下のパッケージにcomxchg方法、このメソッドの実装、それはそれは、オペレーティングシステムおよびCPUレベル呼び出すものです。

後にLOCK命令を呼び出すことにより、Linuxのx86のマルチプロセッサシステムの場合、この方法の詳細については、すぐにメモリを書いて、他のキャッシュ・ラインの故障を行います。


CASの質問:

こうしたバックアップは、他のスレッドを変更するために2回続けて、その後、3で読むために始めとして1、ABAの問題は、最終的な結果は3だった場合、CASが変更されたデータを認識しない可能性があり、このプログラムは、巨大なを持っていますセキュリティリスク。この問題は、フラグのバージョン番号を追加することによって解決することができます。

大規模な、長いスピンの2、長いサイクル時間のオーバーヘッド成功した場合には、優れたCPUのオーバーヘッドをもたらすでしょう。あなたはこの問題を解決するために、適応型スピンロックを使用することができます

図3は、その唯一の共有変数アトミック動作を保証します。例えばのAtomicInteger原子がそれぞれ一つの制御変数です。


 

シングルオーバーヘッドCAS操作:

これは、簡単にCPUのハードウェアアーキテクチャを説明し、8コアCPUのコンピュータシステムです。各CPUがキャッシュのキャッシュ領域を(レジスタ)が、それぞれ2つの相互接続されたCPUモジュールとの間の期間が存在し、ダイ内の二つのコアが互いに通信できることを可能にし、ほとんどの中間システム相互接続がある4つのモジュール管を可能にコア通信。データ「キャッシュライン」システムにおける伝送の単位、2のメモリブロックのバイトの整数パワーに対応するキャッシュラインであります

確実にするために、必要に応じて値を書き込むには、CPU、メインメモリ、キャッシュコヒーレンシプロトコル、コンピュータのCPUは、変数の値を取得するためのシステム、キャッシュラインは、独自のレジスタを保存する変数を含むようにしなければなりません他のCPUは、このことを知って、そのほかのCPUそうか、キャッシュラインのコピーを削除します。

CPU1とCPU5はまた、CPU5は、CAS動作にしたい、その後、変数のキャッシュラインを保持している場合ので、それは、アクセス・システム・レベルの相互接続モジュール、キャッシュラインのCPU保有者が見つからない場合、CPU5,6のインターコネクトモジュールにアクセスする必要があります第一配線モジュールでキャッシュラインを持っていたし、最初のモジュールでインターネットにアクセスし、最終的にはCPU1を発見しました。この時点では、完全なほとんどの操作と考えられています。それはCASをロックするのにかかるよりも、最適なクロック・サイクルの観点から考慮あればはるかに小さいです。

 

おすすめ

転載: www.cnblogs.com/ZoHy/p/11297366.html