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

为君一笑 提交于 2019-12-17 14:21:47

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!