我刚刚读了一个问题 here ,并阅读评分最高的答案 @JB Nizet,我很困惑...... 根据回答,在下面的代码中,
private int a=0;
public void foo(){
int temp=35;
a=28;
a=temp;
}
a=28;
是一个原子操作。
在我在 Stackoverflow 上读到的其他一些问题和答案中,信息是不同的,说 a=28;
是不是原子操作,因为首先右操作数的读操作应该发生,然后写操作发生,这两个操作中的每一个都是原子的,但整个赋值不是(老实说,这就是我认为它的工作方式)。
那 a=temp;
呢?它在原子性方面与 a=28;
有什么不同吗?
顺便说一句,我知道 double 和 long 需要 volatile 才能使对它们的读/写成为原子操作,只是对我上面写的内容感到困惑。
有人可以详细说明一下吗?
谢谢..
最佳答案
Reads and writes are atomic for reference variables and for most primitive variables (all types except long and double).
因为 a=28;
是写入一个既不是 long 也不是 double 的原语,所以它是原子的。
但是 a=temp
不是原子的,因为它由两个独立的操作组成 - 从 temp
读取和写入 int
。其中每一个都是原子的,但不是它们的组合。
关于java - 变量读写的原子性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42914267/