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

Ada*_*ent 6 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;
}
Run Code Online (Sandbox Code Playgroud)

要么

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;
}
Run Code Online (Sandbox Code Playgroud)

假设this.someList标记为volatile.

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

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

eri*_*son 11

这是一个参考,所以这是比较.该文档非常清楚地表明它是一种身份比较,即使使用其描述中==操作也是如此.

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

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