The CAS primitive
compareAndSet(expected, new). Hardware atomic. Either succeeds (value was expected, now new) or fails (value changed).
Advertisement
The CAS primitive
compareAndSet(expected, new). Hardware atomic. Either succeeds (value was expected, now new) or fails (value changed).
Advertisement
The retry pattern
AtomicReference ref;
T current;
T next;
do {
current = ref.get();
next = compute(current);
} while (!ref.compareAndSet(current, next)); The ABA problem
Value goes X → Y → X between your read + CAS. CAS succeeds but state changed. Use versioned refs (AtomicStampedReference) for safety.
Contention vs progress
High contention = many retries. Under extreme contention, lock-free can be slower than a mutex. Measure.
What's built-in
ConcurrentHashMap, AtomicInteger, ConcurrentLinkedQueue — production-tested lock-free. Use these before rolling your own.