1つ:JAVAメモリーモデル
関連する知識ポイント:
マルチレベルキャッシュ、MESIプロトコル、キャッシュコヒーレンスプロトコル、バススニッフィングメカニズム、アトミック操作(8アトミック操作)
volatileキーワードの主な機能は変数の可視性を確保することであり、次に別の役割は命令の順序変更を防ぐことです。なんで?
可視性:MESIプロトコル(ライトバック戦略をサポートするキャッシュコヒーレンスプロトコル)とバススニッフィングメカニズムにより、揮発性が可視性を保証できると判断されます。
詳細な説明:MESIプロトコルは、作業メモリ(キャッシュとも呼ばれる)のデータがメインメモリに書き戻される状況を規定し、バススニッフィングメカニズムは作業メモリ(キャッシュ)の変数をメインメモリの変数と比較します。組み合わせると、MESIプロトコルは、作業メモリの書き込み操作がメインメモリの変数値を同期的に更新することを規定し、バススニッフィングメカニズムは、書き込み操作の現在の変数値がメインメモリと一致しているかどうかを判断します。一致している場合、書き込み操作を実行できます。 (メインメモリ変数の値が他のスレッドによって変更されていないことを示します)。
MESIプロトコル:Modified、Exclusive、Shared、Invalid、ライトバック戦略をサポートするキャッシュコヒーレンシプロトコル。
MESI契約の詳細については、https://www.cnblogs.com/yanlong300/p/8986041.htmlを参照してください。
命令の再配置を防ぐ:理由はメモリの障壁です
詳細な説明:メモリバリアには、ストアメモリバリア(メモリバリアの書き込み)、メモリバリアの読み込み(メモリバリアの読み込み)があり、対応するアトミック操作はストアとロードです。
ロック:ロックが解除されると、jvmはCPUキャッシュを強制的にリフレッシュし、現在のスレッドを変更して他のスレッドから見えるようにします。
volatile:volatileフィールドにマークを付けます。書き込み操作中に、CPUキャッシュが強制的にリフレッシュされ、volatileフィールドにマークが付けられ、メモリが読み取られるたびにメモリが直接読み取られます。(StoreLoadバリア)
final:ジャストインタイムコンパイラは、最後の書き込み操作の後にメモリバリアを挿入して、並べ替えを禁止し、可視性を確保します
2:並行プログラミングの3つの重要な特性
- 原子性:1つまたは複数の操作。すべての操作が実行され、何らかの要因によって中断されないか、すべての操作が実行されるか実行されないかのいずれかです。synchronizedは、コードフラグメントの原子性を保証できます。
- 可視性:変数がシェア変数を変更すると、他のスレッドは変更後すぐに最新の値を見ることができます。volatileキーワードは、シェア変数の可視性を保証できます。
- 順序付け:実行プロセスでのコードの順序、コンパイラーおよびランタイムでのJava最適化、コードの実行順序は、コードが記述されたときの順序とは異なる場合があります(命令の順序変更)。volatileキーワードは、命令が最適化を再配列することを禁止できます。
3:同期キーワードと揮発性キーワードの違い
- volatileキーワードは、スレッド同期の軽量な実装であるため、volatileキーワードは、synchronizedキーワードよりも明らかに優れています。ただし、volatileキーワードは変数にのみ使用でき、synchronizedキーワードはメソッドとコードブロックを変更できます。synchronizedキーワードはJavaSE1.6の後に実装されました。主に、ロックの取得と解放によるパフォーマンスの消費を減らすために導入されたバイアスロックと軽量ロック、およびその他のさまざまな最適化が含まれています。実行効率は大幅に向上しています。同期キーワードが使用されるシナリオは他にもあります。
- volatileキーワードへのマルチスレッドアクセスはブロックされませんが、synchronizedキーワードはブロックされる場合があります
- volatileキーワードは、データの可視性を保証できますが、データの原子性を保証できません。両方の同期キーワードが保証されています。
- volatileキーワードは、主に複数のスレッド間の変数の可視性を解決するために使用されますが、synchronizedキーワードは、複数のスレッド間のリソースへのアクセスの同期を解決します。