在64位虚拟机上编写引用是否是原子操作?

29 浏览
0 Comments

在64位虚拟机上编写引用是否是原子操作?

Java内存模型规定写入int是原子的:也就是说,如果你在一个线程中写入一个值(由4个字节组成),在另一个线程中读取它,你会得到所有的字节或者没有,但永远不会出现2个新字节和2个旧字节等情况。

对于long来说,这并不保证。在这里,将0x1122334455667788写入一个持有0的变量之前,可能导致另一个线程读取到0x112233440000000或0x0000000055667788。

现在规范并不要求对象引用要么是int大小,要么是long大小。出于类型安全的原因,我怀疑它们被保证以原子方式写入,但在64位虚拟机中,这些引用可能是64位值(仅仅是内存地址)。

现在我有以下几个问题:

  • 是否有任何覆盖这一点的内存模型规范(我没有找到)?
  • 在64位虚拟机上,长写操作是否被怀疑是原子的?
  • 虚拟机是否被强制将引用映射为32位?

问候,

Steffen

0