在哪些情况下需要使用带有 Atomic 字段的 volatile 关键字?

In which situations it's needed to use volatile keyword with Atomic field?

Atomic字段在什么情况下需要使用volatile关键字?或者如果字段是 Atomic*** 关键字 volatile 是多余的?

谢谢

None随便。

Or if the field is Atomic*** keyword volatile is redundant?

要么多余,要么都不是正确的工具,视情况而定。

真的没有理由做一个原子场volatile。原子字段应该是最终的,否则使用它们真的没有意义。如果你声明一个原子整数,比如。

AtomicInteger integer = new AtomicInteger(420);

它可以通过它的方法自动访问,例如 incrementAndGet,但仍然可以通过直接分配字段来绕过它们,即分配一个像这样的新值 integer = new AtomicInteger(10) 而不是 integer.set(10) 首先破坏了使用 AtomicInteger 的全部目的。因此,它应该声明为 final

final AtomicInteger integer = new AtomicInteger(420);

这确保它只能使用其原子方法进行更改,而不是通过重新分配变量。当一个变量是 final 时,将它也声明为 volatile 是没有意义的 — Java 甚至不会让你这样做。所以不,没有将两者结合使用的实际场景。

Java Concurrency In Practice 书中很好地提到了差异:

  • Volatile 提供内存可见性保证
  • 原子变量同时提供内存可见性原子性

因此 不需要 对 AtomicXXX 变量使用 volatile 关键字。