この記事では、java に関する関連問題を紹介します。主に、マルチスレッドの並列状況を解決できる CAS、CAS (比較とスワップ)、比較と交換に関連する問題を紹介します。ロックの使用によるパフォーマンスの低下。皆様のお役に立てれば幸いです。
推奨学習: 「java チュートリアル 」
CAS (比較と交換)、比較して交換してください。マルチスレッド並列状況でロックを使用することによって引き起こされるパフォーマンス損失を解決できるメカニズム。CAS 操作には、メモリ位置 (V)、期待される元の値 (A)、および新しい値 (B) の 3 つのオペランドが含まれます。メモリ位置の値が予想される元の値と一致する場合、プロセッサはその位置を新しい値に自動的に更新します。それ以外の場合、プロセッサは何も行いません。スレッドはメイン メモリから num 値を取得し、num に対して操作します。値を書き込むとき、スレッドは取得した最初の num 値とメイン メモリ内の num 値を比較します。それらが等しい場合、変更された値は num になります。それらが等しくない場合、成功するまで比較がループされます。
volatile キーワードはシェア変数を変更するときによく使用されますが、volatile 値には可視性があり、命令の再実行 (順序性) が禁止され、アトミック性は保証されません。シングルスレッドでは問題ありませんが、マルチスレッドではさまざまな問題が発生し、現場の不安が生じます。したがって、CAS は jdk1.5 以降に作成され、オンサイト操作のアトミック性を確保するために CPU プリミティブ (分割不可、継続的、中断なし) を使用します。
JDK1.5 の新しい java.util.concurrent(JUC) は CAS 上に構築されています。同期ロック メカニズムと比較すると、CAS はノンブロッキング アルゴリズムの一般的な実装です。したがって、JUC のパフォーマンスは大幅に向上しました。
例:AtomicInteger クラス、AtomicInteger はスレッドセーフです。以下はソース コードです。
EnterunsafeSeedo while自己ループ、自己ループはここにありますは 期待される元の値を判断します 元の値と一致しない場合は、元の値がリサイクルされ、CASプロセスが実行されます新しい値が正常に割り当てられるまで、この処理が繰り返されます。
cas はオプティミスティック ロックのアイデアであり、ノンブロッキングの軽量オプティミスティック ロックです。ノンブロッキングとは、スレッドの失敗または障害を指します。他のスレッドの障害や一時停止されたアルゴリズムには影響しません。
ABA問題を解きます(結末を考慮した値であれば過程は考慮せず無視して構いません)
Java 学習チュートリアル #"
以上がJava の CAS について詳しく見るの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。