如果有疑问,你可以看看implementation:
public final int accumulateAndGet(int x,
IntBinaryOperator accumulatorFunction) {
int prev, next;
do {
prev = get();
next = accumulatorFunction.applyAsInt(prev, x);
} while (!compareAndSet(prev, next));
return next;
}
public final int updateAndGet(IntUnaryOperator updateFunction) {
int prev, next;
do {
prev = get();
next = updateFunction.applyAsInt(prev);
} while (!compareAndSet(prev, next));
return next;
}
他们一行只不同,显然accumulateAndGet
可以通过updateAndGet
简单地表示:
public final int accumulateAndGet(int x,
IntBinaryOperator accumulatorFunction) {
return updateAndGet(prev -> accumulatorFunction.applyAsInt(prev, x));
}
所以updateAndGet
是较为基本操作和accumulateAndGet
是一个有用的捷径。如果你的x
是不能有效地最终这种快捷方式可能会非常有用:
int nextValue = 5;
if(something) nextValue = 6;
i.accumulateAndGet(nextValue, Math::max);
// i.updateAndGet(prev -> Math.max(prev, nextValue)); -- will not work
是不是能够(重新)使用现有功能(或非捕获方法引用)的有用功能? 'i.incrementAndGet()'和'i.accumulateAndGet(1,Integer :: sum)'之间也没有功能上的区别...... – Holger
@Holger accumulateAndGet()'后来加了,再加上它不能使用'Unsafe'。 'addAndGet(1)'可能是一个更好的例子,但即使在创建时不使用“不安全”。不过,我确实接受你的一般观点;这个问题只是为了澄清这是否确实是动机。 – shmosel