我查看了其他关于volatile vs. Atomicxxxx问题的stackoverflow帖子(包括这个),并阅读了java.util.current.atomic的说明,但对细微差别不太满意。
如果我要在使用volatile boolean
和AtomicBoolean
之间做出决策,除了AtomicBoolean提供的原子读写操作(如compareAndSet()
和getAndSet()
)之外,还有实际区别吗?
假设我有以下代码:
volatile boolean flag;
如果我有一个线程读取标志并执行某些操作,然后清除该标志,在此之前一个或多个线程设置了该标志(但未清除它),这时使用volatile
关键字是否足够安全?
与volatile boolean
相比,AtomicBoolean
的成本是否更高,包括内存空间和性能开销(volatile boolean
需要内存屏障,而AtomicBoolean
需要内存屏障+一些CAS操作上的轻微锁定,如java.util.current.atomic描述所示)。
我的直觉是只使用AtomicBoolean
以确保安全,但我想知道是否存在使用volatile boolean
的情况(例如,如果有数千个实例且性能成为问题)。
volatile
关键字所要解决的问题。 - Johan Sjöberg