出于Java编程语言存储器模型的目的,对非易失性long或 double值的单个写入被视为两个单独的写入:每个32位半写一个。这可能导致线程从一次写入看到64位值的前32位,而从另一次写入看到第二次32位的情况。
volatile long和doublevalues的写入和读取 始终是原子的。
无论是否将它们实现为32位或64位值,对引用的写入和读取始终是原子的。
某些实现可能会发现将64位上的单个写操作long或double值划分为相邻32位值上的两个写操作很方便。为了效率,这种行为是特定于实现的; Java虚拟机的实现可以自由地或原子地或分两部分执行写入long和double值。
鼓励Java虚拟机的实现避免在可能的情况下拆分64位值。鼓励程序员将共享的64位值声明为volatile或正确同步其程序以避免可能的复杂情况。