有没有AtomicInteger.accumulateAndGet()
不能用AtomicInteger.updateAndGet()
代替的场景,还是只是为了方便方法引用?
这是一个简单的示例,我没有看到任何功能差异:
AtomicInteger i = new AtomicInteger();
i.accumulateAndGet(5, Math::max);
i.updateAndGet(x -> Math.max(x, 5));
显然,getAndUpdate()
和 getAndAccumulate()
也是如此。
最佳答案
如有疑问,您可以查看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
不是有效的 final,这种快捷方式可能特别有用:
int nextValue = 5;
if(something) nextValue = 6;
i.accumulateAndGet(nextValue, Math::max);
// i.updateAndGet(prev -> Math.max(prev, nextValue)); -- will not work
关于java - AtomicInteger.updateAndGet() 和 AtomicInteger.accumulateAndGet() 之间在功能上有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022739/