在64位VM上写入参考primefaces
java内存模型要求写一个int
是primefaces的:也就是说,如果你在一个线程中给它写一个值(由4个字节组成)并在另一个线程中读取它,你将得到所有的字节或者没有,但是从来没有2个新的字节和2个旧字节等等。
这不能保证long
。 在这里,将0x1122334455667788
写入一个保存为0
的variables可能会导致另一个线程读取0x112233440000000
或0x0000000055667788
。
现在规范并没有要求对象引用是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,或者正确同步它们的程序以避免可能的复杂性。
(强调添加)