Java で volatile キーワードを使用する場合の注意事項

高洛峰
リリース: 2017-02-27 15:20:17
オリジナル
1750 人が閲覧しました

揮発性変数には同期された可視性プロパティがありますが、アトミックなプロパティはありません。これは、スレッドが揮発性変数の最新値を自動的に検出できることを意味します。揮発性変数はスレッド セーフを提供するために使用できますが、非常に限られた使用例にのみ使用できます。複数の変数間、または変数の現在値と変更された値の間に制約はありません。したがって、volatile だけでは、カウンター、ミューテックス、または複数の変数に関連する不変条件を持つものを実装するには十分ではありません。

volatile キーワードは Java の少し弱い同期メカニズムですが、なぜ弱いメカニズムと呼ばれるのでしょうか。

これを理解する前に、まず Java が同期時に準拠する必要がある 2 つのメカニズムを見てみましょう:

1. 可視性: 1 つのスレッドが共有変数を変更すると、別のスレッドは変更された値を読み取ることができます。

2. アトミック性: 不可分性を指します。ここでは、プログラムの実行中に操作を中断できない場合、それはアトミックな操作であることを意味します。

volatile キーワードは原子性を保証できず、可視性のみを保証するため、通常の状況では、このキーワードを同期操作に使用することはできません。ただし、次の 2 つの特定の条件が満たされる場合は、同期に使用できます:

1. 演算結果は変数の現在の値に依存しないか、単一のスレッドのみが変数の値を変更することが保証されます。変数。

2. 変数は他の状態変数との不変制約に参加する必要はありません

例:

volatile boolrean flag;
public void close(){
    flag = true;
}
public void open(){
   while(!flag){
    ...
   }
}
ログイン後にコピー

このとき、open() メソッドの実行は flag の値に依存し、同期はまたは、他の同期方法の方が面倒です。 この場合、シナリオは上記 2 つの条件を満たしているため、同期に volatile キーワードを使用できます。

volatile キーワードの原則:

volatile によって変更された変数は、レジスタやその他の場所にキャッシュされません。各書き込みはメイン メモリに直接書き込まれ、読み取りもメイン メモリから読み取られます。したがって、視認性は保証されます。

上記は編集者が紹介した Java での volatile キーワードの使用上の注意事項です。ご質問があればメッセージを残してください。編集者がすぐに返信します。また、PHP 中国語 Web サイトをサポートしていただきありがとうございます。


Java で volatile キーワードを使用する際の注意事項に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート