我多次使用过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?
答案 0 :(得分:11)
这是引用,所以这是比较的。该文档非常清楚地表明它是一种身份比较,即使使用its description.中的==
操作
我经常使用AtomicReference
和其他原子类。分析表明它们的性能优于使用同步的等效方法。例如,get()
上的AtomicReference
操作只需要从主内存中获取,而使用synchronized
的类似操作必须首先将线程缓存的任何值刷新到主内存,然后执行它的获取。
AtomicXXX
类提供对比较和交换(CAS)操作的本机支持的访问。如果底层系统支持它,CAS将比纯Java中使用synchronized
块的任何方案更快。