Java易失性参考与AtomicReference

问题

avolatileObject引用和AtomicReference之间是否有任何区别我只想使用来自AtomicReferenceget()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。