In caso di dubbio, si può guardare in 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;
}
Essi differiscono solo per singola linea e, ovviamente, accumulateAndGet
potrebbe essere espresso in modo semplice via updateAndGet
:
public final int accumulateAndGet(int x,
IntBinaryOperator accumulatorFunction) {
return updateAndGet(prev -> accumulatorFunction.applyAsInt(prev, x));
}
Così updateAndGet
è un po 'più di base operazione e accumulateAndGet
è una scorciatoia utile. Tale collegamento potrebbe essere particolarmente utile se il vostro x
non è efficace finale:
int nextValue = 5;
if(something) nextValue = 6;
i.accumulateAndGet(nextValue, Math::max);
// i.updateAndGet(prev -> Math.max(prev, nextValue)); -- will not work
fonte
2016-03-16 01:03:06
Non è la possibilità di (ri) utilizzare le funzioni esistenti (oi riferimenti ai metodi non acquisiti) una funzione utile? Non c'è inoltre alcuna differenza funzionale tra 'i.incrementAndGet()' e 'i.accumulateAndGet (1, Integer :: sum)' ... – Holger
@Holger 'accumulateAndGet()' è stato aggiunto più tardi, inoltre non può usare 'Unsafe'. 'addAndGet (1)' potrebbe essere un esempio migliore, ma anche quello non stava usando 'Unsafe' nel momento in cui è stato creato. Tuttavia, accetto il tuo punto generale; questa domanda è solo per chiarire se questa fosse davvero la motivazione. – shmosel