当前位置:  开发笔记 > 编程语言 > 正文

Java易失性参考与AtomicReference

如何解决《Java易失性参考与AtomicReference》经验,为你挑选了4个好方法。

volatileObject引用之间是否有任何区别AtomicReference,如果我只使用get()set()-methods AtomicReference



1> pgras..:

简短的回答是:不.

从java.util.concurrent.atomic包doc:

访问和更新原子的记忆效应通常遵循挥发物的规则:

get具有读取volatile变量的记忆效应.

set具有写入(赋值)volatile变量的记忆效应.

顺便说一句,包的文档非常好,一切都解释了......


lazySet(在Java 6中引入)是一个引入的新操作,它具有通过volatile变量无法实现的语义; 有关更多信息,请参阅此帖子.


而答案会更长?
更长答案的链接:http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/atomic/package-summary.html

2> Avi..:

不,那里没有.

AtomicReference提供的额外功能是compareAndSet()方法和朋友.如果您不需要这些方法,则volatile引用提供与AtomicReference.set()和.get()相同的语义.



3> Nitsan Wakar..:

有几个不同之处和权衡:

    使用AtomicReferenceget/set具有与volatile字段相同的JMM语义(如javadoc状态),但它AtomicReference是引用的包装器,因此对字段的任何访问都涉及进一步的指针追踪.

    内存占用乘以(假设压缩糟糕的环境,这是真实的大多数虚拟机):

    volatile ref = 4b

    AtomicReference = 4b + 16b(12b对象标题+ 4b ref字段)

    AtomicReference提供比易失性参考更丰富的API.您可以使用AtomicFieldUpdater或使用Java 9 a 重新获得易失性引用的API VarHandle.sun.misc.Unsafe如果你喜欢用剪刀跑步,你也可以直达.AtomicReference本身是使用Unsafe.

那么,什么时候选择一个比另一个好:

只需要获取/设置?坚持不稳定的领域,最简单的解决方案和最低的开销.

需要额外的功能吗?如果这是性能(速度/内存开销),则代码的敏感部分会在AtomicReference/ AtomicFieldUpdater/ Unsafe您倾向于支付可读性的位置和性能增益风险之间做出选择.如果这不是一个敏感区域,那就去吧AtomicReference.库编写者通常使用这些方法的混合,具体取决于目标JDK,预期的API限制,内存约束等.



4> endless..:

JDK源代码是回答这种混淆的最佳方法之一.如果查看AtomicReference中的代码,它会使用一个volatie变量进行对象存储.

private volatile V value;

因此,显然如果您要在AtomicReference上使用get()和set(),就像使用volatile变量一样.但正如其他读者所评论的那样,AtomicReference提供了额外的CAS语义.因此,首先要确定是否需要CAS语义,如果只是,那么请使用AtomicReference.


*"JDK源代码是解决此类混淆的最佳方法之一"*=>我不一定同意 - javadoc(这是该类的合同)是最好的方法.您在代码中找到的内容回答了特定实现的问题,但代码可以更改.
例如,hashmap中的[this variable](http://stackoverflow.com/a/14363501/829571)在JDK 6中是易变的,但在Java 7中不再是volatile.你是否根据变量的基础来编写代码不稳定,在升级你的JDK时它会破坏......不可否认,这个例子不同但你明白了.
推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有