何时使用AtomicReference(Java)?真的有必要吗?

时间:2010-05-28 21:03:10

标签: java concurrency atomic

我多次使用过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?

1 个答案:

答案 0 :(得分:11)

这是引用,所以这是比较的。该文档非常清楚地表明它是一种身份比较,即使使用its description.中的==操作

我经常使用AtomicReference和其他原子类。分析表明它们的性能优于使用同步的等效方法。例如,get()上的AtomicReference操作只需要从主内存中获取,而使用synchronized的类似操作必须首先将线程缓存的任何值刷新到主内存,然后执行它的获取。

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