volatile关键字是否由于多线程应用程序中的AtomicXXX变量而失去了相关性



来自文档页面:

包java.util.courrent.atomic描述:

一个小的类工具包,支持对单个变量进行无锁线程安全编程。本质上,这个包中的类将volatile值、字段和数组元素的概念扩展到了那些还提供形式的原子条件更新操作的类

boolean compareAndSet(expectedValue, updateValue);

原子包中有许多选项,如

AtomicBoolean
AtomicInteger
AtomicLongArray

等等,我可以使用这些AtomicXXX并慢慢消除遗留代码中的易失性变量吗

编辑:

  1. 保持CCD_ 1用于单次写入&不同线程中的多次读取操作(我在阅读了许多文章后得出的结论)、多作者、单读者案例(根据@erickson评论)
  2. 使用CCD_ 3进行多次更新&在多个线程之间进行多次读取以避免CCD_ 4。为可变变量提供原子性

我的思维过程已经改变了@erickson comments. volatile支持多写&"单次读取",但可能会因多次写入和多次读取而失败。我对这个概念感到困惑。

是的,AtomicXXX实例提供了与访问volatile字段相同的可见性保证。

然而,AtomicXXXvolatile字段做更多的,因此,它们的使用成本有点高。具体而言,它们提供的操作更像是优化的volatile0块,而不是volatile读或写。您可以递增--get,或者比较--swap——多个操作,原子化易失性变量不提供任何原子性。

因此,从volatile切换到AtomicXXX并不一定是一个好举措。考虑到数据的使用方式,这是否合理,也许可以对原型进行一些分析,看看它会对性能产生什么影响。

最新更新