web-dev-qa-db-ja.com

Java 32/64ビットjvmのプリミティブ?

  1. intのサイズは32ビットで、long/doubleは64ビットです。これらのサイズはで同じままですか?
    1. 32/64ビットJVM
    2. 32/64ビットプロセッサ
  2. はいの場合、long/doubleの操作は64ビットプロセッサ/ JVMでアトミックになりますか?

Oracle Javaチュートリアルによると

読み取りと書き込みは、参照変数とほとんどのプリミティブ変数(longとdoubleを除くすべてのタイプ)に対してアトミックです。

このステートメントは、jvm/processorアーキテクチャと関係がありますか?誰か説明してもらえますか?.

3。最後に、64ビットのjv​​mとプロセッサを使用すると、double/longアトミックの読み取り/書き込みを行うことができます。

22
Rekha

はい、サイズは32ビットと64ビットの両方のJVMで同じです。 Javaでは、割り当てがlongまたはdoubleに対してアトミックであることが保証されていません。アトミック割り当ては、まだ別のスレッドからの可視性を保証するものではありません。スレッドはメモリ内の変数を「シャドウ」することが許可されているため、変数へのアトミックな割り当てでさえ、必ずしもメインメモリへのライトスルーではありません(ただし、メインメモリの場合)更新され、アトミックに実行されます)。 1つのスレッドが他のスレッドによる変更を一貫して確認することが予想される場合、2つ以上のスレッドから共有状態にアクセスするときは、mustは常に何らかの同期バリアを使用する必要があります。

16
brettw

サイズを変更する唯一のデータ型は参照です。これらは32ビットまたは64ビットにすることができます。参照はすべての64ビットJVMで64ビットであり、より多くのメモリを使用するために存在するというのはよくある誤解です。 Sun/Oracle Java 6 update 23以降では、ヒープのサイズが32 GB未満の場合、32ビット参照を使用することがデフォルトになりました。

注:64ビット参照はアトミックであり、これらのプラットフォームでのlongおよびdoubleアクセスもアトミックである可能性があることを示しています。 (すべてのシステム、特に32ビットJVMでの使用が保証されているわけではありません)

5
Peter Lawrey

[〜#〜] jls [〜#〜] によると:
整数型はbyte、short、int、およびlongであり、その値は8ビット、16ビット、32ビット、および64ビットの符号付き2の補数整数です。 、およびchar。値はUTF-16コード単位を表す16ビットの符号なし整数です。

フロートとダブルについても同じことが言えます。

32ビット/ 64ビットプロセッサ/実装jvmについては言及されていないため、32ビットと64ビットのどちらを使用していても変更はありません。

4
Jerome

intは32ビットとして定義されています。 64ビットVMと32ビットVMでは変更されません。 longと同じ-64ビットであり、変更されません。

doubleは少し注意が必要です。スペックによると64ビット幅なので、少なくともそれを頼りにすることができます。一部のVMは、実際の計算を行うために内部でより広い数値を使用する場合がありますが、常にdoubleを64ビットの数値として扱う場合(またはstrictfpを指定する場合)は問題ありません。数値が正確に 64ビット幅であること、または少なくともそれらがそうであるかのように動作することを保証することになっています)。

アトミック性に関しては、それはプラットフォームにいくらか依存します...しかし、intより大きいものへの読み取りと書き込みがnotアトミックであると仮定すると安全です(変数がvolatile)。また、同じ場所の読み取りと書き込みを伴うものは、どのタイプでもアトミックではありません。 (これの意味は ++a;は本質的にアトミックではありません。)

3
cHao

プリミティブのサイズは同じままです。 64ビットプロセッサ/ jvmでは、ヒープサイズが大きくなり、使用できるスレッドの数が増えます。

2
MykoB