在java中,当Long、Long、Double、Double等变量自动装箱或取消装箱时,读写操作是原子操作吗



我知道这个:

对于引用变量和大多数基元变量(除了long和double之外的所有类型(,读取和写入都是原子的。对于所有声明为volatile的变量(包括长变量和双变量(,读取和写入都是原子的。

但我想知道当Long、Long、Double、Double等变量自动装箱或取消装箱时,读取或写入操作是原子操作吗?

例如:

private Long a;    
private long b;    
private Double c;    
private double d;
a = 2; //is this operation atomic?    
b = a; //is this operation atomic?    
d = 3;    
c = d; //is this operation atomic

你说:

对于引用变量和大多数基元变量(除长变量和双变量外的所有类型(,读取和写入都是原子的

a = 2;

这是对引用变量的写入,所以它是原子

b = a;

这相当于

read a
call a.longValue()
assign result to b

因此,它读取一个引用变量(原子(,然后从long对象中获得一个不可变的长值(因此原子性无关紧要(,并写入一个长原语(因此不能保证是原子(

d = 3;

这写入一个基元双(因此不能保证是原子(

c = d;

这相当于

read d
call Double.valueOf(value)
assign result to b

因此,它从基元double读取(因此不能保证是原子的(,然后将值转换为double,并将该引用写入引用变量(原子(

相关内容

  • 没有找到相关文章

最新更新