我刚刚阅读了一个问题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;
有什么不同?
顺便说一句,我知道volatile需要double和long才能对它们进行原子读/写操作,只是对我上面写的内容感到困惑。
有人可以详细说明这个吗?
谢谢..
答案 0 :(得分:6)
读取和写入对于引用变量和大多数原始变量(除了long和double之外的所有类型)都是原子的。
由于a=28;
是写入不长或双的基元,因此它是原子的。
但是a=temp
不是原子的,因为它包含两个独立的操作 - 从temp
读取和写入int
。这些都是原子的,但不是它们的组成。