读取和写入变量的原子性

时间:2017-03-20 21:26:40

标签: java atomicity

我刚刚阅读了一个问题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才能对它们进行原子读/写操作,只是对我上面写的内容感到困惑。

有人可以详细说明这个吗?

谢谢..

1 个答案:

答案 0 :(得分:6)

根据official documentation

  

读取和写入对于引用变量和大多数原始变量(除了long和double之外的所有类型)都是原子的。

由于a=28;是写入不长或双的基元,因此它是原子的。

但是a=temp不是原子的,因为它包含两个独立的操作 - 从temp读取和写入int。这些都是原子的,但不是它们的组成。