gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:05:57 26 4
gpt4 key购买 nike

来自文档 page :

包 java.util.concurrent.atomic 说明:

A small toolkit of classes that support lock-free thread-safe programming on single variables. In essence, the classes in this package extend the notion of volatile values, fields, and array elements to those that also provide an atomic conditional update operation of the form

boolean compareAndSet(expectedValue, updateValue);

在原子包中有很多可用的选项,比如

AtomicBoolean
AtomicInteger
AtomicLongArray

等等,我可以使用这些 AtomicXXX 并慢慢摆脱遗留代码中的 volatile 变量吗?

编辑:

  1. 保持 volatile 用于不同线程中的单写和多读操作(我在阅读许多文章后得出的结论)、多作者、单读者的情况(根据 @erickson 评论)
  2. 使用AtomicXXX 在多个线程中进行多次更新和多次读取以避免同步。为可变变量提供原子性。

@erickson评论改变了我的思维过程。volatile 支持多写和单读,但可能会因多写和多读而失败。我对这个概念感到困惑。

最佳答案

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

但是,AtomicXXXvolatile 字段做的更多,因此,它们的使用成本更高。具体来说,它们提供的操作更像是优化的 synchronized block ,而不是 volatile 读取或写入。您递增--获取,或比较--交换—多个操作,原子地。 volatile 变量不提供任何原子性。

因此,从 volatile 切换到 AtomicXXX 不一定是一个好举动。考虑数据的使用方式是否有意义,或许可以对原型(prototype)进行一些分析,看看它会对性能产生什么影响。

关于java - 由于多线程应用程序中的 AtomicXXX 变量,volatile 关键字是否失去了相关性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37281948/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com