Working with VarHandle API

1. Creating VarHandles (lookup)

FactoryFor
findVarHandle(cls, name, type)Instance field
findStaticVarHandle(cls, name, type)Static field
arrayElementVarHandle(arrayClass)Array element
byteArrayViewVarHandle(viewClass, order)byte[] as int/long view

2. Using Atomic Operations

MethodEffect
compareAndSet(target, expected, new)Volatile CAS
getAndSet(target, new)Atomic exchange
getAndAdd(target, delta)Atomic add (numeric)
getAndBitwiseOr/And/XorAtomic bitwise

3. Using Memory Ordering

ModeSemantics
PlainNo ordering, no atomicity guarantee
OpaquePer-variable ordering, no synchronization
Acquire/ReleasePairwise happens-before
VolatileSequentially consistent (full fence)

4. Accessing Array Elements Atomically

APIUse
VarHandle vh = arrayElementVarHandle(int[].class)Setup
vh.compareAndSet(arr, idx, exp, new)CAS slot
vh.getVolatile(arr, idx)Volatile read

5. Accessing Field Values

OperationMethod
Readget(target)
Writeset(target, val)
Volatile read/writegetVolatile / setVolatile
Acquire/ReleasegetAcquire / setRelease

6. Understanding Performance Benefits vs Atomic Classes

AspectVarHandleAtomicX
MemoryOperates on existing fieldWrapper object overhead
IndirectionNoneObject reference
FlexibilityMultiple ordering modesVolatile only
UseFields in your own classesStandalone counters

7. Using Fence Operations

FenceEffect
fullFence()StoreLoad — strongest
acquireFence()LoadLoad + LoadStore
releaseFence()LoadStore + StoreStore
loadLoadFence / storeStoreFenceSpecific ordering

8. Understanding Plain vs Opaque vs Volatile Access

ModeAtomic?OrderingCost
PlainNoNoneCheapest
OpaquePer-varCoherence onlyLow
Acquire/ReleaseYesOne-wayMedium
VolatileYesSC-DRFHighest

9. Using VarHandle with Arrays

Example: Lock-free counter array

private static final VarHandle AA = MethodHandles.arrayElementVarHandle(long[].class);
public void increment(long[] arr, int i) {
    long cur;
    do { cur = (long) AA.getVolatile(arr, i); }
    while (!AA.compareAndSet(arr, i, cur, cur + 1));
}
OperationUse
getVolatileSee latest value
compareAndSetLock-free update
getAndAddCounter increment

10. Combining VarHandle with MethodHandle

PatternUse
VarHandle as MHvh.toMethodHandle(AccessMode.SET)
CAS in MH chainCompose with insertArguments
Generated bytecodeUse both for high-perf lock-free structures