【发布时间】:2019-12-06 08:17:01
【问题描述】:
来自AtomicLong的源码:
public final boolean compareAndSet(long expect, long update) {
return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
}
来自AtomicLongFieldUpdater的源码:
public static <U> AtomicLongFieldUpdater<U> newUpdater(Class<U> tclass,
String fieldName) {
Class<?> caller = Reflection.getCallerClass();
if (AtomicLong.VM_SUPPORTS_LONG_CAS)
return new CASUpdater<U>(tclass, fieldName, caller);
else
return new LockedUpdater<U>(tclass, fieldName, caller);
}
// CASUpdater extends AtomicLongFieldUpdater
public final boolean compareAndSet(T obj, long expect, long update) {
accessCheck(obj);
return U.compareAndSwapLong(obj, offset, expect, update);
}
// LockedUpdater extends AtomicLongFieldUpdater
public final boolean compareAndSet(T obj, long expect, long update) {
accessCheck(obj);
synchronized (this) {
long v = U.getLong(obj, offset);
if (v != expect)
return false;
U.putLong(obj, offset, update);
return true;
}
}
我的问题是为什么这两个类使用不同的方式来更新长值? IE。为什么AtomicLongFieldUpdater 有条件地回退到锁定方法,而AtomicLong 没有?
【问题讨论】:
-
与stackoverflow.com/questions/46817970/… 和stackoverflow.com/questions/17239568/… 相关。但似乎没有一个页面质疑“为什么不同”......
标签: java compare-and-swap