java - java中Long,long,Double,double等变量自动装箱或拆箱时,读写操作是原子的吗?

标签 java multithreading atomic jls java-memory-model

我知道this :

Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double). Reads and writes are atomic for all variables declared volatile (including long and double variables).

但是我想知道 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

最佳答案

你说:

Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double)

a = 2;

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

b = a;

这相当于

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

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

d = 3;

这写入原始 double (因此不能保证是原子的)

c = d;

这相当于

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

所以这从原始 double (因此不能保证是原子的)读取,然后将值转换为 double 并将该引用写入引用变量(原子的)

关于java - java中Long,long,Double,double等变量自动装箱或拆箱时,读写操作是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38802442/

相关文章:

linux - "atomic"系统调用是什么意思?

java - 结果集编码问题

java 通用调用方法 vs 普通调用

java - 在Java项目中引用.dat文件

Python & FreeBSD : threading. currentThread().ident 即使在不同的进程中也返回相同的值

c++ - 从多个线程访问 QTcpSocket

c# - 我在异步/等待方面做错了什么?

java - 责任链与类列表相比有哪些优点?

multithreading - 基本互斥锁和原子整数哪个更有效?

c++ - 如何使用 boost atomic 来消除竞争条件?