ホームページ  >  記事  >  Java  >  Javaでのvolatileキーワードの使用法は何ですか

Javaでのvolatileキーワードの使用法は何ですか

PHPz
PHPz転載
2023-05-14 18:52:061297ブラウズ

1. volatile の役割

  • マルチスレッド環境で共有変数の可視性を確保できます

  • 次の方法で複数の命令を防止します。メモリバリアの追加 並べ替え

2. 可視性とは

可視性とは、スレッドが共有変数を変更すると、他のスレッドがその変更を即座に確認できることを意味します。可視性は本質的にいくつかの側面によって引き起こされます

Javaでのvolatileキーワードの使用法は何ですか

#CPU レベル キャッシュ。CPU の計算効率の問題を解決するために、CPU 内に 3 レベルのキャッシュが設計されています。メモリ IO 効率の問題ですが、キャッシュの一貫性の問題も発生します。マルチスレッド実行の場合、キャッシュの一貫性の問題は可視性の問題につながります。そのため、volatile 変更された共有変数を追加します。 キーワードの場合、jvm 仮想マシンは #lock アセンブリ命令を自動的に追加し、この命令はさまざまな CPU モデルに応じて バス ロック または キャッシュを自動的に追加します。

3. バス ロックとキャッシュ ロックとは

  • バス ロックは CPU フロントサイド バスをロックします。その結果、同時に、 1 つのスレッドがメモリと通信するため、マルチスレッドの同時実行によって引き起こされる可視性の問題が回避されます。

  • バス ロックは CPU 使用率の大幅な増加につながるため、キャッシュ ロックはバス ロックの最適化です。効率が低下するため、キャッシュ ロックは CPU の 3 次キャッシュ内のターゲット データのみをロックし、キャッシュ ロックは MESI キャッシュ整合性プロトコルを使用して実装します。

4. 命令とは並べ替え

命令の並べ替え命令は、書き込まれたデータの順序と実行の順序が矛盾しているため、マルチスレッド環境では可視性の問題が発生します。命令の並べ替えは、本質的にはパフォーマンスを最適化する手段です。命令の並べ替えには、ソートが含まれます。いくつかの側面から

  • #CPU レベルは、

    MESI プロトコル をさらに最適化し、CPU 使用率を向上させます。彼は、StoreBuffer というメカニズムを導入しました。この最適化メカニズムは、CPU のアウトオブオーダー実行につながります。このような問題を回避するために、CPU はメモリ バリア命令を提供します。上位層のアプリケーションは、適切な場所にメモリ バリアを挿入して、CPU 命令を回避できます。並べ替えの問題

  • コンパイル プロセス中に、コンパイラーは、シングル スレッドのセマンティクスとプログラムの正確さを変更することなく、最適化するために命令を合理的に並べ替えます。全体的なパフォーマンスのため、

    volatile キーワードは次のようになります。

共有変数に追加されるため、コンパイラ レベルによってコンパイラの最適化がトリガーされることはありません。同時に、jvm では、並べ替えの問題を回避するためにメモリ バリア命令が挿入されます。 JDK5 から開発された

volatile キーワードに加えて、JMM は Happens-Before モデルを使用してマルチスレッドの可視性関係を記述します。つまり、Happens- 2 つの操作間に の関係がある場合、2 つの操作には可視性の関係があり、volatile キーワードの追加を考慮する必要はありません。可視性を保証するには

以上がJavaでのvolatileキーワードの使用法は何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。