【发布时间】:2011-06-20 01:17:10
【问题描述】:
我查看了 SO 中的其他 volatile 与 Atomicxxxx 问题(包括 this one)并阅读了 the description of java.util.current.atomic,但我对其中的细微差别不太满意。
如果我试图在使用volatile boolean 和AtomicBoolean 之间做出决定,除了AtomicBoolean 提供的原子读-修改-写操作之外,是否还有实际差异? (例如compareAndSet() 和getAndSet())
假设我有
volatile boolean flag;
然后一个或多个线程设置标志(但不清除它)。如果我有一个线程读取标志,并且如果设置,则执行一项操作,然后清除标志,volatile 是否足够?
就
而言,AtomicBoolean 是否比 volatile boolean 成本更高- 内存空间
- 性能下降(
volatile boolean似乎需要内存防护,AtomicBoolean似乎需要内存防护 + 根据 java.util.current.atomic 描述对 CAS 操作进行一些小锁定)
我的直觉是只使用 AtomicBoolean 并确保安全,但我想了解是否有任何情况可以使用 volatile boolean 代替(例如,如果我有数千个实例并且性能是一个问题)。
【问题讨论】:
-
你想用这个标志做什么?您是使用标志来控制并发还是其他?我想知道潜在的问题是否有助于解释您正在寻找的答案。
-
If I have one thread that reads the flag, and if set, does an action, and then clears the flag, is volatile adequate?是的,这正是volatile关键字应该为您解决的问题。 -
@Jonathan:这只是一个特定的例子......我正在考虑一个程序,其中我的组件标记为“脏”,需要持久性。组件将自己标记为“脏”,持久性管理器会找到脏组件,保存它们的状态,并将它们标记为非脏。
-
@BuZZ-dEE,这个问题早于我的问题,但我在撰写本文时已经阅读了它(在尝试使用 modpowers 之前,您能否完整阅读这些问题?)并且还有更多我提出的详细问题。所以是的,有重叠,但不,它不是重复的。
标签: java concurrency atomic volatile