在哪些情况下需要使用带有 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 关键字。
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 关键字。