jvm对long和double的原子性

本文探讨了在Java中,64位的long和double类型的读写操作在不同内存模型下的原子性问题。32位操作系统中,由于单次操作的最大数据为32位,导致long的读取可能不具原子性,引发线程安全问题。JSR-133内存模型(JDK5起)规定,long的读操作具备原子性,但写操作会被拆分为两个32位写操作,因此不具原子性。解决这个问题的方法是使用volatile关键字,它能确保long变量的读写操作具有原子性以及顺序性和可见性。
摘要由CSDN通过智能技术生成

long和double作为java中的基本数据类型,当我们读取一个基本数据类型的时候,自然而然想的就是线程安全的,但是其实不然,jvm的原子操作有以下几种:

lock:将一个变量标识为被一个线程独占状态
unclock:将一个变量从独占状态释放出来,释放后的变量才可以被其他线程锁定
read:将一个变量的值从主内存传输到工作内存中,以便随后的load操作
load:把read操作从主内存中得到的变量值放入工作内存的变量的副本中
use:把工作内存中的一个变量的值传给执行引擎,每当虚拟机遇到一个使用到变量的指令时都会使用该指令
assign:把一个从执行引擎接收到的值赋给工作内存中的变量,每当虚拟机遇到一个给变量赋值的指令时,都要使用该操作
store:把工作内存中的一个变量的值传递给主内存,以便随后的write操作
write:把store操作从工作内存中得到的变量的值写到主内存中的变量

但是当我们load一个long变量时,32位的操作系统单次操作的最大数据为32位,那么jvm读取一个64位的long类型时,会分为两次读取,如果有两个线程都在读,那么可能会导致两个线程读取long的高位和地位错位,导致读取错误

下面有个测试程序可以验证,32位的操作系统会出现问题:

public class LongAtomTest implements Runnable {

    private static long field = 0;

    private volatile long value;

    public long getValue() {
        return value;
    }

    public void setValue(long value) {
        this.value &
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值