【问题标题】:When to use AtomicReference (Java)? Is it really necessary?何时使用 AtomicReference (Java)?真的有必要吗?
【发布时间】:2010-05-28 21:03:09
【问题描述】:

我用过很多次AtomicLong,但从来不用AtomicReference

似乎 AtomicReference 也可以(我从另一个 stackoverflow 复制了这段代码 问题):

public synchronized boolean compareAndSet(List<Object> oldValue, List<Object> newValue) { 
    if (this.someList == oldValue) {
        // someList could be changed by another thread after that compare,
        // and before this set
        this.someList = newValue;
        return true;
    }
    return false;
}

或者

public synchronized boolean compareAndSet(List<Object> oldValue, List<Object> newValue) { 
    if (this.someList == oldValue || this.someList.equals(oldValue)) {
        // someList could be changed by another thread after that compare,
        // and before this set
        this.someList = newValue;
        return true;
    }
    return false;
}

假设 this.someList 被标记为 volatile。

我不确定它到底是哪一个,因为如果使用 .equals,javadoc 和该类的代码不清楚。

看到上面的方法不是那么难写,有没有人使用过 AtomicReference?

【问题讨论】:

  • They曾经用过。

标签: java concurrency atomic


【解决方案1】:

这是一个参考,所以这是比较的。文档清楚地表明这是一个身份比较,即使使用 its description. 中的 == 操作

我经常使用AtomicReference 和其他原子类。分析表明,它们比使用同步的等效方法执行得更好。例如,对AtomicReferenceget() 操作只需要从主内存中提取,而使用synchronized 的类似操作必须首先将线程缓存的所有值刷新到主内存,然后执行其提取。

AtomicXXX 类提供对比较和交换 (CAS) 操作的原生支持的访问。如果底层系统支持它,CAS 将比使用纯 Java 中的 synchronized 块编写的任何方案都要快。

【讨论】:

  • 我当然是个白痴。它的 java.lang.ref 我在想它就像 AtomicObject 如果有的话。
  • 你如何评价这个基准:edgblog.wordpress.com/2013/10/01/…
  • @WaldemarWosiński 使用AtomicLong 来维护值将比synchronized 块中的long 更快,这将是直接的苹果对苹果的比较。对象分配解释了一些差异,但由于 CAS 中的比较失败而重试会加剧这种差异。如果您关心并发应用程序的速度,请坚持使用没有副作用的操作(例如 longAtomicLong 实现)。
  • 很好的答案,谢谢埃里克森! Stack 上的最佳答案。
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 2017-10-29
  • 2018-04-05
  • 2021-01-25
  • 1970-01-01
  • 2010-10-18
  • 2011-04-27
  • 1970-01-01
相关资源
最近更新 更多