【发布时间】:2016-05-17 16:39:20
【问题描述】:
来自文档page:
包java.util.concurrent.atomic说明:
一个小的类工具包,支持对单个变量进行无锁线程安全编程。本质上,这个包中的类将 volatile 值、字段和数组元素的概念扩展到还提供表单的原子条件更新操作的那些类
boolean compareAndSet(expectedValue, updateValue);
在原子包中提供了许多选项,例如
AtomicBoolean
AtomicInteger
AtomicLongArray
等等,我可以使用这些 AtomicXXX 并慢慢摆脱遗留代码中的 volatile 变量吗?
编辑:
- 保持
volatile用于不同线程中的单次写入和多次读取操作(我在阅读了许多文章后得出的结论)、多写入器、单读取器的情况(根据@ericksoncmets) - 使用
AtomicXXX在多个线程之间进行多次更新和多次读取以避免synchronization。为 volatile 变量提供原子性。
@ericksoncomments.volatile 改变了我的思维过程,支持多写和单读`,但可能因多写和多读而失败。我对这个概念感到困惑。
【问题讨论】:
-
没有。它们不是
volatile的替代品,它们是用锁保护单个变量的替代品。 -
如果是这种情况,我应该在哪里使用 volatile 变量?只有单写多读操作?
-
当所有线程必须立即看到对变量的赋值,而另一种同步机制尚未保证时:Do you ever use the volatile keyword in Java?
-
@OrangeDog,
java.util.concurrent.atomic包的 Javadoc 说,“原子访问和更新的记忆效应通常遵循 volatile 规则”(docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/…)
标签: java multithreading volatile