人们回答了我回答第一部分的问题时提供了好的观点和参考。
具体到问题的第二部分,我在某个论坛上阅读过:
volatile声明的long是原子的(也是Java
5之前的版本),在某种意义上说,它保证(对于所有JVM实现)直接对主内存(而不是两个32位寄存器)进行读取或写入。
和
在Java 5之前的版本中,volatile被 认为
可以提供长久的保证。但是,在实践中事情并没有以这种方式解决,并且实现经常违反此保证。我记得这个问题似乎已经在JDK
1.4上解决了,但是由于他们仍在处理整个内存模型,因此直到JDK 5宣布新规则和内存时,他们才真正发表任何明确的声明。保证实际上意味着什么。
这是来自 Java语言规范第二版的 :
17.4双原子和长原子的非原子处理
即使变量的类型是double或long,对volatile变量的加载,存储,读取和写入操作也是原子的。



