在64位VM上写入参考primefaces

java内存模型要求写一个int是primefaces的:也就是说,如果你在一个线程中给它写一个值(由4个字节组成)并在另一个线程中读取它,你将得到所有的字节或者没有,但是从来没有2个新的字节和2个旧字节等等。

这不能保证long 。 在这里,将0x1122334455667788写入一个保存为0的variables可能会导致另一个线程读取0x1122334400000000x0000000055667788

现在规范并没有要求对象引用是int或long-sized。 由于types安全的原因,我怀疑他们是保证写成primefaces,但在一个64位的虚拟机,这些参考可能是非常好的64位值(只是内存地址)。

这里是我的问题:

  • 是否有任何内存模型规范覆盖(我还没有find)?
  • 长篇文章怀疑是64位的虚拟机上的primefaces吗?
  • 虚拟机是否被迫将引用映射到32位?

问候,Steffen

参见JLS第17.7节:双primefaces和长primefaces的非primefaces处理

对于Java编程语言内存模型而言,对非易失性long或double值的单个写入被视为两个独立的写入:每个32位一半。 这可能导致线程从一次写入看到64位值的前32位,而从另一次写入看到第二个32位。

写入和读取volatile和double值始终是primefaces的。

写入和读取引用始终是primefaces的,无论它们是以32位还是64位值实现的。

有些实现可能会发现将64位long或double值的单个写入操作划分为相邻32位值的两个写入操作是很方便的。 为了提高效率,这个行为是针对具体实现的; Java虚拟机的实现可自由地执行写入长和双值的primefaces或两部分。

鼓励实施Java虚拟机,以避免在可能的情况下分割64位值。 鼓励程序员将共享的64位值声明为volatile,或者正确同步它们的程序以避免可能的复杂性。

(强调添加)