2016-05-14 3 views
5

Goetz、Peierls、Bloch et al。 2006:実践でのJava並行処理このJava 64ビット数値可変マルチスレッドルールは、Java 1.8でも有効ですか、それとも古くなっていますか?

3.1.2。非単調64ビット操作

スレッドが同期なしで変数を読み取ると、無効な値が表示されることがありますが、少なくともランダムな値ではなくスレッドによって実際にそこに配置された値が表示されます。この安全性の保証は、薄いエアーアウトの安全と呼ばれています。

薄い空気の安全性は、揮発性と宣言されていない64ビット数値変数(第3.1.4項を参照)を除いて、すべての変数に適用されます。 Javaメモリモデルでは、フェッチおよびストア操作をアトミックにする必要がありますが、不揮発変数のlongおよびdouble変数の場合、JVMは64ビットの読み取りまたは書き込みを2つの別々の32ビット操作として扱うことができます。読み書きが異なるスレッドで発生すると、不揮発性のlong型を読み込み、ある値の上位32ビットと別の値の下位32ビットを取り戻すことができます。[3]

このように、無効な値を気にしなくても、volatileまたはlockで保護されていない限り、マルチスレッドプログラムで共有変数longおよびdouble変数を使用することは安全ではありません。

[3] Java仮想マシン仕様書が作成されたとき、多くの広く使用されているプロセッサーアーキテクチャーでは、効率的にアトミックな64ビット算術演算を行うことができませんでした。

これは2004年にリリースされたJava 5のリリース後に書かれました。多くの変更がマルチスレッド化と並行処理のプログラミングを容易にしました。だからなぜそれはまだ適用されますか?今でも10年後?

32ビットハードウェアでJavaアプリケーションを実行することができるだけであれば、必要に応じてJVMランタイムオプションを使用できないのはなぜですか?

このスレッドを気にせずにマルチスレッドおよび低遅延アプリケーションをコーディングできることは有益でしょうか?

+0

ランタイムオプションの機能は何ですか?アトミックな64ビットメモリ操作をサポートするアーキテクチャでは、それらを有効にします(オプションをオフにする必要はありません)。私は、64ビットJDKを実行するとそのケースが予想されます。しかし、プログラマとして私はそれに依存したくないでしょう(そして、JLSは私たちが@ kordirkoの答えの引用符を見てはならないと言っているようです)。 – Thilo

答えて

6

Java 1.8では、この64ビット数値可変マルチスレッドルールはまだtrueですか、それとも古くなっていますか?

はい、それはまだ本当である、Javaの8仕様を参照してください:非揮発性longにJavaプログラミング言語のメモリモデル、単一の書き込みの目的のために
https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.7

かdouble値は、2つの別々の書き込みとして扱われます(それぞれの32ビットの半分に1つずつ)。これにより、スレッドが から64ビット値の最初の32ビットを1つの書き込みに、もう1つの32ビットを別の書き込みから見る という状況が発生する可能性があります。

volatile long値とdouble値の書き込みと読み取りは、常にアトミックです。

32ビットまたは64ビット値として実装されているかどうかにかかわらず、参照への書き込みおよび読み出しは常にアトミックです。


、なぜそれはまだ適用されていますか?
https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.7

いくつかの実装は、それが便利に2つの書き込み動作中に64ビット長または二重値に単一の書き込み アクションを分割するかもしれません:説明は、明細書でもある

隣接する32ビット値。効率を上げるため、この動作は実装固有の です。 Java仮想マシン のインプリメンテーションは、longおよびdouble値への書き込みをアトミックに、または の2つの部分に自由に実行できます。

可能であれば、Java仮想マシンの実装では、 の64ビット値の分割を避けることをお勧めします。プログラマは、 に、共有の64ビット値をvolatileとして宣言するか、または可能であれば複雑さを避けるために、プログラム を正しく同期させることをお勧めします。小型8ビットまたは16が装備することができる。例えば、携帯電話、ルータ、多分など、冷蔵庫、洗濯機、掃除機などの、ために - 私はJavaは、多くのハードウェアモデル上で実行されているので、これはあると思い

マイクロプロセッサ。そして、Javaの仕様はすべてのものに共通です。