什么时候使用AtomicReference(Java)?真的有必要吗?

j0pj023g  于 2023-02-07  发布在  Java
关注(0)|答案(1)|浏览(157)

我使用过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;
}

假设someList被标记为volatile。
我不确定是哪一个,因为如果使用了.equals,javadoc和该类的代码还不清楚。
看到上面的方法并不那么难写,有人用过AtomicReference吗?

qgelzfjb

qgelzfjb1#

这是一个 reference,所以这就是比较的内容,文档非常清楚地表明这是一个标识比较,甚至在其描述中使用了==操作。
我经常使用AtomicReference和其他原子类,分析表明它们比使用同步的等效方法执行得更好,例如,AtomicReference上的get()操作只需要从主内存中提取,而使用synchronized的类似操作必须首先将线程缓存的任何值刷新到主内存中,然后执行其提取。
AtomicXXX类提供了对比较和交换(CAS)操作的本地支持,如果底层系统支持,CAS将比纯Java中使用synchronized块的任何方案都要快。

相关问题