ホームページ  >  記事  >  Java  >  Java の予約語 volatile と synchronized との違い

Java の予約語 volatile と synchronized との違い

高洛峰
高洛峰オリジナル
2016-12-13 11:20:181327ブラウズ

1. ロックは、相互排他と可視性という 2 つの主な機能を提供します。相互排他により、一度に 1 つのスレッドのみが特定のロックを保持できるため、この機能を使用して共有データへの調整されたアクセス プロトコルを実装し、一度に 1 つのスレッドのみが共有データを使用できるようにすることができます。可視性はより複雑で、ロックが解放される前に共有データに加えられた変更が、その後ロックを取得する別のスレッドに可視であることを保証する必要があります。同期メカニズムによって提供される可視性の保証がなければ、スレッドが認識するものは、共有変数に以前のものがある可能性があります。値や一貫性のない値が存在すると、多くの深刻な問題が発生する可能性があります。

2. Java では、マルチスレッドがデータを読み書きするときにデータの一貫性を確保するために、次の 2 つの方法を使用できます:

同期

たとえば、synchronized キーワードを使用するか、ロックを使用します。 object.

volatile

volatile キーワードを使用します

volatile を 1 つの文に要約すると、変数の値が変更されたときに他のスレッドができるだけ早く知ることができます。

volatile の詳細な説明

まず第一に、次のことを行う必要があります。このような現象があることをまず理解してからコンパイルしてください。プログラムの実行を高速化するために、いくつかの変数の書き込み操作は最初にレジスタまたは CPU キャッシュ上で実行され、最後にメモリに書き込まれます。変数の新しい値は他のスレッドには見えません。そして、volatile の機能は、変更する変数の読み取りおよび書き込み操作がメモリ内で実行される必要があることです

volatile と同期されていることです。レジスタ内の現在の変数の値が不確実であり、メインメモリから読み取る必要がある jvm を読み取る場合、現在のスレッドのみが変数にアクセスでき、他のスレッドはブロックされます。

volatile は変数の変更の可視性を実装できますが、アトミックな特性を持ちません。一方、synchronized は変数の変更の可視性とアトミック性を保証できます。

synchronized とマークされた変数は、コンパイラによって最適化される可能性があります。したがって、volatile キーワードを使用する場合は注意してください。単純型変数が volatile で変更されている限り、変数の値が以前の値によって決定される場合 (n=n+1、n++、など)、この変数に対するすべての操作が元の操作であるという意味ではありません。など、変数の値が以前の値と関係がない場合にのみ、変数に対する操作がアトミックになります (n = m + 1 など)。これが元のレベルです。したがって、揮発性キーを使用するときは注意が必要です。よくわからない場合は、揮発性キーの代わりに同期キーを使用できます。

要約: volatile の本質は、レジスター内の現在の変数の値が不確実であり、メインメモリーから読み取る必要があることを JVM に伝えることです。 synchronized の一部の効果は実現できますが、n=n+1、n++ などの場合、volatile キーワードは無効になり、synchronized と同じスレッド同期効果を実現できません。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。