读取和写入变量的原子性

Jam*_*ins 1 java atomicity

我刚刚在这里读了一个问题,并且阅读了@JB Nizet最评价的答案,我感到困惑......根据答案,在下面的代码中,

private int a=0;

public void foo(){
  int temp=35;
  a=28;
  a=temp;
}
Run Code Online (Sandbox Code Playgroud)

a=28; 是原子操作.

在我在#1读过一些其他的问题和答案,信息是不同的,说a=28;不是一个原子操作,因为第一右操作数的读操作时发生,则写操作发生,并且每个这两个操作是原子的,但整个任务不是(说实话,这就是我认为它的工作方式).

那怎么样a=temp;?它a=28;与原子性有什么不同?

顺便说一下,我知道volatile和double需要对它们进行原子读/写操作,只是对我上面写的内容感到困惑.

有人可以详细说明吗?

谢谢..

Mal*_*alt 6

根据官方文件:

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

因为a=28;写入一个不长或双的原语,它是原子的.

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