今天看《Java并发编程实战》的书中,关于long和double的原子性有这么一段话,意思就是在JVM中,对于32位(或者如下)的数值变量都是原子性读写,可是对于long和double这种64位的操做是非原子性。分红两次32位的操做。编程
在如下这种操做中就会出现读取的数值错误。并发
线程A先写高位32位操做,优化
线程B读高位32位,操作系统
线程B读地位32位,线程
线程A写地位32位。排序
那么解决办法就是对变量加上volatile关键字,volatile关键字有3个主要功能,第一个就是可见性,每次直接从内存读写。第二个就是禁止指令重排序,在JVM中会对指令进行优化,优化的时候可能会对指令进行排序。第三个就是对volatile修饰的变量读取都是原子性的。内存
可是书上没有说操做系统的位数和JVM的位数。变量
因此我猜测,只有64位JVM+64位操做系统+64位硬件才能实现对64位long和double的原子性读取。硬件