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