ホームページ  >  記事  >  Java  >  Java におけるキーワード volatile と synchronized の機能と違い

Java におけるキーワード volatile と synchronized の機能と違い

巴扎黑
巴扎黑オリジナル
2017-06-26 10:20:181622ブラウズ

volatile は変数修飾子ですが、synchronized はコードまたはメソッドに作用します ; 3 つの get メソッドのコードは次のとおりです:

1 int i1;2 int geti1() {return i1;}3 4 volatile int i2;5 int geti2() {return i2;}6 7 int i3;8 synchronized int geti3() {return i3;}

geti1() は、現在のスレッド。複数のスレッドには i1 変数の複数のコピーがあり、これらの i1 は互いに異なる場合があります。つまり、別のスレッドがそのスレッドの i1 値を変更した可能性があり、この値は現在のスレッドの i1 値と異なる可能性があります。 Java メモリ モデルには、変数の現在の「正確な値」を格納するメイン メモリ (メイン メモリ領域) があり、各スレッドにも独自のメモリ (レジスタなど) があります。パフォーマンス上の理由から、スレッドはアクセスする変数のコピーを自身のメモリに保持します。このように、ある時点で、あるスレッドのメモリ内の同じ変数の値が、別のスレッドのメモリの値またはメイン メモリの値と一致しない状況が発生します。したがって、実際には、メインメモリの i1 の値が 1、スレッド 1 の i1 の値が 2、スレッド 2 の i1 の値が 3 になる可能性があります。これにより、両方のスレッドでそれぞれの i1 値が変更されます。そして、この変更はメイン メモリや他のスレッドに渡される前に発生します。

geti2() はメインメモリの i2 値を取得します。 変数を volatile として宣言すると、その変数はいつでも他のスレッドによって変更されるため、スレッド メモリにキャッシュできなくなります。 言い換えれば、変数が volatile に変更された後、その値はすべてのスレッドで同期される必要があり、いずれかのスレッドがその値を変更すると、他のすべてのスレッドはすぐに同じ値を取得します。したがって、スレッドが変数の独自のコピーを持つ方が効率的であるため、volatile で変更された変数は、アクセス時に通常の変数よりも少し多くのリソースを消費します。

geti3() メソッドは synchronized によって変更されます。 synchronized を使用してメソッドまたはコードの一部を変更すると、最大 1 つのスレッドが同時にコードを実行できることが保証されます。 volatile キーワードによりスレッド間のデータ同期が実現されているのに、なぜ同期が必要なのでしょうか? 2 つの同時スレッドが同じオブジェクト内の synchronized(this) 同期コードにアクセスする場合、一度に 1 つのスレッドのみを実行できます。別のスレッドは、このコード ブロックを実行する前に、現在のスレッドがこのコード ブロックの実行を完了するまで待つ必要があります。ただし、あるスレッドがオブジェクトの synchronized (this) 同期コード ブロックにアクセスしても、別のスレッドはオブジェクト内の非 synchronized (this) 同期コード ブロックに引き続きアクセスできます。特に重要なのは、スレッドがオブジェクトの synchronized(this) 同期コード ブロックにアクセスすると、オブジェクト内の他のすべての synchronized(this) 同期コード ブロックへの他のスレッドのアクセスがブロックされることです。スレッドがオブジェクトの synchronized(this) 同期コード ブロックにアクセスすると、このオブジェクトのオブジェクト ロックが取得され、その結果、オブジェクトのすべての同期コード部分への他のスレッドのアクセスが一時的にブロックされます。

違いを要約します :

まず、volatile は変数修飾子ですが、synchronized はコードまたはメソッドの一部に作用します。

次に、volatile はスレッド メモリとメイン メモリ (メイン メモリ) の間で変数の値のみを同期しますが、synchronized はモニタをロックおよびロック解除することですべての変数の値を同期します。明らかに、同期は揮発性よりも多くのリソースを消費します。

以上がJava におけるキーワード volatile と synchronized の機能と違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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