int
的大小为32位,long
/ double
为64位。这些尺寸是否保持相同
long
/ double
上的操作在64位处理器/ JVM上是否为原子操作?读取和写入对于引用变量和大多数原始变量(除long和double之外的所有类型)都是原子的。
此声明是否与jvm / processor体系结构有关? 有人可以解释一下。
第3。如果我使用64位jvm和处理器
,我将能够进行双/长原子的读/写操作答案 0 :(得分:15)
是的,32位和64位JVM的大小相同。对于Java中的长或双,分配不保证是原子的。原子分配仍然无法保证来自另一个线程的可见性。因为允许线程在内存中“遮蔽”变量,所以即使对变量进行原子赋值也不一定要写入主内存(但是当主内存 更新时,它将以原子方式完成)。如果您希望一个线程始终看到另一个线程的更改,那么必须始终使用某种类型的同步障碍从两个或多个线程访问共享状态。
答案 1 :(得分:5)
唯一更改大小的数据类型是引用。这些可以是32位或64位。一种常见的误解是,所有64位JVM上的引用都是64位,并且会使用更多内存。在Sun / Oracle Java 6更新23及更高版本上,它成为使用32位引用的默认设置,规定堆的大小小于32 GB。
注意:64位引用是原子的,表明这些平台上的long
和double
访问也可能是原子的。 (虽然不能保证在所有系统上,特别是32位JVM)
答案 2 :(得分:4)
根据JLS:
整数类型是byte,short,int和long,其值分别为8位,16位,32位和64位二进制补码整数,以及char,其值为16-表示UTF-16代码单元的无符号整数。
同样适用于float和double。
没有提到32位/ 64位处理器/实现jvm,因此在32位或64位时不会有任何修改。
答案 3 :(得分:3)
int
定义为32位。它不会随64位与32位VM的变化而变化。与long
相同 - 它是64位,不会改变。
double
有点棘手。规格说它是64位宽,所以你至少可以指望它。有些虚拟机可能会在内部使用更宽的数字来进行实际的数学计算,但是如果你总是将double
视为64位数字(或者你指定strictfp
,那么你会没事的。确保数字正好 64位宽,或至少表现得好像。
至于原子性,这在某种程度上取决于平台...但是你可以安全地假设对大于int的任何东西的读写都是而不是原子(除非变量标记为{ {1}})。任何涉及阅读然后编写相同位置的内容对于任何类型都不是原子的。 (这意味着volatile
本质上不是原子的。)
答案 4 :(得分:2)
原始尺寸保持不变。在64位处理器/ jvm上,堆大小更大,可以使用的线程数增加。