由于多线程应用程序中的 AtomicXXX 变量,volatile 关键字是否失去了相关性?
Does volatile keyword lost its relevance due to AtomicXXX variables in multi-threaded applications?
来自文档 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
用于不同线程中的单写和多读操作(我看了很多文章后的结论),多写者,单reader情况(根据@erickson
评论)
- 使用
AtomicXXX
在多个线程中进行多次更新和多次读取以避免synchronization
。为 volatile 变量提供原子性。
@erickson 改变了我的思维过程comments.
volatile 支持多写和单读,但在多写和多读时可能会失败。我对这个概念感到困惑。
是的,AtomicXXX
实例提供与访问 volatile
字段相同的可见性保证。
然而,AtomicXXX
比volatile
字段多,因此,它们的使用成本更高一些。具体来说,它们提供的操作更像是优化的 synchronized
块,而不是 volatile
读取或写入。您递增-and-get,或比较-and-swap——多个动作,原子地。易变变量不提供任何原子性。
因此,从 volatile
切换到 AtomicXXX
并不一定是一个好的举措。考虑数据的使用方式是否有意义,或许可以对原型进行一些分析,看看它会对性能产生什么影响。
来自文档 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
用于不同线程中的单写和多读操作(我看了很多文章后的结论),多写者,单reader情况(根据@erickson
评论) - 使用
AtomicXXX
在多个线程中进行多次更新和多次读取以避免synchronization
。为 volatile 变量提供原子性。
@erickson 改变了我的思维过程comments.
volatile 支持多写和单读,但在多写和多读时可能会失败。我对这个概念感到困惑。
是的,AtomicXXX
实例提供与访问 volatile
字段相同的可见性保证。
然而,AtomicXXX
比volatile
字段多,因此,它们的使用成本更高一些。具体来说,它们提供的操作更像是优化的 synchronized
块,而不是 volatile
读取或写入。您递增-and-get,或比较-and-swap——多个动作,原子地。易变变量不提供任何原子性。
因此,从 volatile
切换到 AtomicXXX
并不一定是一个好的举措。考虑数据的使用方式是否有意义,或许可以对原型进行一些分析,看看它会对性能产生什么影响。