今天看《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的原子性读取。