java - 变量读写的原子性

标签 java atomic

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

有人可以详细说明一下吗?

谢谢..

最佳答案

根据official documentation :

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/

相关文章:

java - 将请求范围数据传递给 CDI 中的异步方法

java - 是否可以忽略 Float::= HexFloat 并只看到数字字符?

java - ExceptionMapper 在 Jersey 2.x 和 javax 中无法一致工作

python - Python 2.X 中的 `print` 内置函数是原子函数吗?

c++ - 使用 "got there first"标志而不是锁/互斥来同步对数据的访问

c++ - 如何在 C++11 中实现 StoreLoad 屏障?

java - OpenJDK 10 和 Java SE 10 引用实现之间的区别

java - 构建 ER 图时如何让 Intellij 显示关系基数?

windows - 在 Windows 中使用 IOCP 时缓存 OVERLAPPED 结构

c++ - 在 C++11 std::atomic 中,用于++、-- 和 += 等运算符的 memory_order 是什么?