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