volatile keyword
java4 と java5 以降での使用の違いは何ですか?
それに関連して、
非アトミック変数 (long/double) に対する読み取り/書き込み操作は、volatile として宣言されている場合、アトミックです。
これはjava4にも当てはまりますか、それともjava5以降で有効ですか???
volatile keyword
java4 と java5 以降での使用の違いは何ですか?
それに関連して、
非アトミック変数 (long/double) に対する読み取り/書き込み操作は、volatile として宣言されている場合、アトミックです。
これはjava4にも当てはまりますか、それともjava5以降で有効ですか???
はい、違いがあります。
Java 4volatile
までは、以前の読み取りまたは書き込みに関してコンパイラーによって再順序付けされる可能性があり、double check
ロックを実装できなくなるなどの微妙な並行性のバグにつながります (シングルトンの非常に一般的なイディオム)。
これは Java 5.0 で修正されました。Java 5.0 ではセマンティクスが拡張さvolatile
れ、後続の読み取りまたは書き込みに関して並べ替えができなくなり、新しいメモリ モデルが導入されました。このDouble Checked Lockingを参照用に読むことができます
このサイトでは、違いがよく説明されています: http://www.javamex.com/tutorials/synchronization_volatile.shtml
また、別のページで Java 5 の volatile の動作について説明しています: http://www.javamex.com/tutorials/synchronization_volatile_java_5.shtml
人々は、私の質問への回答の最初の部分に回答して、良い点と参考文献を提供してくれました。
質問の2番目の部分に特化して、これは私がいくつかのフォーラムで読んだものです:
volatile 宣言された long は、(すべての JVM 実装に対して) 読み取りまたは書き込みが 2 つの 32 ビット レジスタではなくメイン メモリに直接行われることを保証するという意味で (Java 5 以前も) アトミックです。
と
Java 5 より前のバージョンでは、volatile はlong と double に対してそのような保証を提供するはずでした。しかし、実際にはこのようにうまくいかず、実装がこの保証に違反することがよくありました。私が思い出したように、この問題はJDK 1.4あたりで修正されたように見えましたが、彼らはまだメモリモデル全体に取り組んでいたため、新しいルールが発表されたJDK 5まで明確な発表をしませんでした。保証は実際に何かを意味しました。
そして、これはJava言語仕様、第2版からのものです:
17.4 double と long の非アトミック処理
volatile 変数に対するロード、ストア、読み取り、および書き込みアクションは、変数の型が double または long であってもアトミックです。
java4 と java5 以降で volatile キーワードを使用する場合の違いは何ですか?
JDK5 より前の JMM は壊れており、JDK4 に volatile を使用すると、意図した結果が得られない場合があります。詳細については、 http ://www.ibm.com/developerworks/library/j-jtp02244/ を確認してください。
非アトミック変数 (long/double) に対する読み取り/書き込み操作は、volatile として宣言されている場合、アトミックです。
long/double の読み取り/書き込みは、2 つの別個の 32 ビット操作として行われます。2 つのスレッドの場合、1 つのスレッドが long/double 変数の上位 32 ビットを読み取り、別のスレッドが下位 32 ビットを読み取る可能性があります。つまり、長い読み取り/書き込みは、他のプリミティブとは異なり、アトミック操作ではありません。long/double に volatile を使用すると、コンパイラによって volatile の命令が volatile の読み取り/書き込み用に並べ替えられないなどの保証が提供され、volatile は可視性も保証されます。ただし、JDK 4 以前では機能しない可能性があります。