我知道这个:
对于引用变量和大多数基元变量(除了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,并将该引用写入引用变量(原子(