Java volatile关键字是否因多线程应用程序中的AtomicXXX变量而失去相关性?

Java volatile关键字是否因多线程应用程序中的AtomicXXX变量而失去相关性?,java,multithreading,volatile,Java,Multithreading,Volatile,从文件: 包java.util.concurrent.atomic描述: 支持单变量无锁线程安全编程的小型类工具包。本质上,这个包中的类将volatile值、字段和数组元素的概念扩展到那些还提供表单的原子条件更新操作的类 在原子包中有许多选项,如 AtomicBoolean AtomicInteger AtomicLongArray 等等,我可以使用这些AtomicXXX并在遗留代码中慢慢去除易失性变量吗? 编辑: 保持volatile在不同线程中进行单写和多读操作(我在阅读了许多文章后得出的

从文件:

包java.util.concurrent.atomic描述:

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

在原子包中有许多选项,如

AtomicBoolean
AtomicInteger
AtomicLongArray
等等,我可以使用这些AtomicXXX并在遗留代码中慢慢去除易失性变量吗?

编辑:

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

  • 我的思维过程已被@erickson
    注释所改变。
    volatile支持多次写入和单次读取`但可能会因多次写入和多次读取而失败。我对这个概念感到困惑

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

    然而,
    AtomicXXX
    volatile
    字段做的更多,因此,它们的使用成本更高。具体来说,它们提供的操作更像是优化的
    同步的
    块,而不是
    易失性的
    读或写。您可以以原子方式递增和获取或比较和交换多个操作。易变变量不提供任何原子性


    因此,从
    volatile
    切换到
    AtomicXXX
    并不一定是一个好的举动。考虑数据如何使用是否有意义,也许在原型上做一些分析,看看它会产生什么样的性能影响。

    不,它们不是对<代码> Value的替代,它们是用锁来保护单个变量的替代物。如果是这样的话,我应该在哪里使用易失性变量?只有单写和多读操作?当所有线程都必须立即看到变量的赋值,而另一种同步机制还不能保证这一点时:另外:@OrangeDog,
    java.util.concurrent.atomic
    包的Javadoc说,“原子访问和更新的记忆效应通常遵循挥发物的规则”()@Ravindrababu任何由多个线程读写的字段都需要像
    volatile
    这样的内存屏障来确保可见性;但是
    volatile
    只有在该字段可以独立于所有其他字段进行修改时才足够。它不仅限于单写器、多读器的情况。它还可以用于多wri单读取器情况。除非受锁保护,否则多写不会导致不一致吗?如果我没有正确理解您的观点,请原谅。如果
    atomicInteger.get()
    atomicInteger.set(n)
    m=myVolatile
    myVolatile=n
    更昂贵,这不是因为存在
    addAndGet
    compareAndSet
    方法。这可能是因为
    get()
    set()
    是方法调用。@Ravindrababu锁获取和释放与volatile读写或AtomicXXX读写具有相同的内存语义。@Ravindrababu如果您的程序使用
    AtomicXXX.get()
    AtomicXXX.set()是正确的
    仅限,使用
    volatile
    是正确的。如果需要在一些读写组合中使用
    synchronized
    (如
    x++
    )为了使您的程序正确,那么
    java.util.concurrent.atomic
    包可能会提供一个更有效的替代方案。原子类型与
    synchronized
    关键字比
    volatile
    更为相似。
    AtomicBoolean
    AtomicInteger
    AtomicLongArray