关于JVM中long和double的读取原子性

今天看《Java并发编程实战》的书中,关于long和double的原子性有这么一段话,意思就是在JVM中,对于32位(或者如下)的数值变量都是原子性读写,可是对于long和double这种64位的操做是非原子性。分红两次32位的操做。编程

在如下这种操做中就会出现读取的数值错误。并发

  1. 线程A先写高位32位操做,优化

  2. 线程B读高位32位,操作系统

  3. 线程B读地位32位,线程

  4. 线程A写地位32位。排序

那么解决办法就是对变量加上volatile关键字,volatile关键字有3个主要功能,第一个就是可见性,每次直接从内存读写。第二个就是禁止指令重排序,在JVM中会对指令进行优化,优化的时候可能会对指令进行排序。第三个就是对volatile修饰的变量读取都是原子性的。内存


可是书上没有说操做系统的位数和JVM的位数。变量

因此我猜测,只有64位JVM+64位操做系统+64位硬件才能实现对64位long和double的原子性读取。硬件

相关文章
相关标签/搜索