不知道我是否正确理解了您的问题,但不确定JLS
8.3.1.4。volatile字段指出:
字段可以声明为volatile,在这种情况下,Java内存模型可确保所有线程看到的变量值都是一致的(第17.4节)。
也许更重要的是,JLS
17.7双重和长期的非原子处理:
长的双17.7非原子治疗和
[…]对于Java编程语言存储器模型的目的,对非易失性长或双值的单个写入被视为两个单独的写操作:一个用于每个32位半。这可能导致线程从一次写入中看到64位值的前32位,而从另一次写入中看到后32位的情况。
易失的long和double值的写入和读取始终是原子的。 引用的写入和读取始终是原子的,无论它们是实现为32位还是64位值。
也就是说,“整个”变量受volatile修饰符保护,而不仅仅是两个部分。这使我断言说,对s 使用volatile 比对s 更为重要
,因为对于非易失性longs / doubles来说, 甚至读取 都不是原子的。
long``int__



