问题
avolatile
Object引用和AtomicReference
之间是否有任何区别我只想使用来自AtomicReference
的get()
和set()
-methods?
#1 热门回答(96 赞)
简短的回答是:不。
来自java.util.concurrent.atomic package doc:
原子的访问和更新的记忆效应通常遵循volatile的规则:get具有读取volatile变量的记忆效应。 set具有写入(赋值)volatile变量的记忆效应。
顺便说一句,包的文档非常好,一切都解释了......
lazySet
(在Java 6中引入)是一个引入的新操作,具有通过volatile
变量无法实现的语义;有关更多信息,请参阅this post)。
#2 热门回答(38 赞)
不,那里没有。
AtomicReference提供的额外功能是compareAndSet()方法和朋友。如果你不需要这些方法,则volatile引用提供与AtomicReference.set()和.get()相同的语义。
#3 热门回答(6 赞)
JDK source code是回答这种混淆的最好方法之一。如果查看AtomicReference中的代码,它会使用一个volatie变量进行对象存储。
private volatile V value;
所以,显然如果你要在AtomicReference上使用get()和set()就像使用volatile变量一样。但正如其他读者所评论的那样,AtomicReference提供了额外的CAS语义。因此,首先要确定是否需要CAS语义,如果只是,那么请使用AtomicReference。