美文网首页
long和double类型的操作是不是原子操作

long和double类型的操作是不是原子操作

作者: 达微 | 来源:发表于2020-07-08 19:09 被阅读0次

读了“深入java虚拟机”后发现里面提到int等不大于32位的类型上的操作都是原子操作,
但是某些jvm的实现使得对long和double类型的操作并不是原子操作,这样就会造成错误数据的出现。

错误数据出现的原因是:
对于long和double变量,把他们作为2个原子性的32位值来对待,而不是一个原子性的64位值,
这样将一个long型的值保存到内存的时候,可能是2次32位的写操作,
2个竞争线程想写不同的值到内存的时候,可能导致内存中的值是不正确的结果。

1、写入高位32位值(线程2)
2、写入高位32位值(线程1)
3、写入低位32位值(线程1)
4、写入低位32位值(线程2)

这样内存中的值变成线程1的高32位值和线程2的低32位值的组合,是个错误的值。
书中还提到,上面出现问题的long和double变量是没有声明为volatile的变量,
这使我产生疑问,难道声明为volatile就可以避免上面问题的发生吗?

volatile本身不保证获取和设置操作的原子性,仅仅保持修改的可见性。但是java内存模型保证声明为volatile的long和double变量的get和set操作是原子的。

相关文章

  • long和double类型的操作是不是原子操作

    读了“深入java虚拟机”后发现里面提到int等不大于32位的类型上的操作都是原子操作,但是某些jvm的实现使得对...

  • JAVA原子操作

    JAVA中原子操作有哪些? 1: java的基本类型中除了long和double类型的赋值操作.基本类型如下:by...

  • java 多线程、线程池

    概念: 原子性 原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作...

  • java并发编程概念

    原子性 原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分...

  • 原子性和一致性

    原子性 原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分...

  • long和double类型操作的非原子性探究

    一、前言 “深入java虚拟机”中提到,int等不大于32位的基本类型的操作都是原子操作,但是某些jvm对long...

  • 10. 并发终结之Volatile

    volatile关键字的作用:保障可见性、保障有序性以及保障long/double类型的变量读写操作的原子性需要注...

  • Java 中 long 是不是原子操作?

    Java中long和double的原子性 java中基本类型中,long和double的长度都是8个字节,32位(...

  • Java 中 long 是不是原子操作?

    Java中long和double的原子性 java中基本类型中,long和double的长度都是8个字节,32位(...

  • volatile

    1、volatile关键字主要有三方面作用 1、实现long/double类型变量的原子操作2、防止指令重排序(内...

网友评论

      本文标题:long和double类型的操作是不是原子操作

      本文链接:https://www.haomeiwen.com/subject/oghhcktx.html