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