Khi nghi ngờ, bạn có thể nhìn vào 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;
}
Họ chỉ khác nhau ở dòng duy nhất và rõ ràng accumulateAndGet
có thể được thể hiện một cách dễ dàng thông qua updateAndGet
:
public final int accumulateAndGet(int x,
IntBinaryOperator accumulatorFunction) {
return updateAndGet(prev -> accumulatorFunction.applyAsInt(prev, x));
}
Vì vậy updateAndGet
phần nào cơ bản hơn hoạt động và accumulateAndGet
là một phím tắt hữu ích. phím tắt như vậy có thể đặc biệt hữu ích nếu x
của bạn không phải là một cách hiệu quả cuối cùng:
int nextValue = 5;
if(something) nextValue = 6;
i.accumulateAndGet(nextValue, Math::max);
// i.updateAndGet(prev -> Math.max(prev, nextValue)); -- will not work
Nguồn
2016-03-16 01:03:06
Không phải là khả năng (tái) sử dụng các hàm hiện có (hoặc tham chiếu phương thức không bắt giữ) một tính năng hữu ích? Cũng không có sự khác biệt về chức năng giữa 'i.incrementAndGet()' và 'i.accumulateAndGet (1, Integer :: sum)'… – Holger
@Holger 'accumulateAndGet()' được thêm vào sau, cộng với nó không thể sử dụng 'Unsafe'. 'addAndGet (1)' có thể là một ví dụ tốt hơn, nhưng thậm chí không sử dụng 'Unsafe' tại thời điểm nó được tạo ra. Tuy nhiên, tôi chấp nhận điểm chung của bạn; câu hỏi này chỉ là để làm rõ cho dù đó thực sự là động lực. – shmosel