Metaprogramming

metaprogramming3VarHandles

Path
pkg17metaprogramming/metaprogramming3VarHandles.java
Package
pkg17metaprogramming
Study order
3
Run
Single-file source launch
Command
java pkg17metaprogramming/metaprogramming3VarHandles.java

There is no in-browser runner. This is the file from the curriculum, unchanged.

pkg17metaprogramming/metaprogramming3VarHandles.java
1package pkg17metaprogramming;2 3import java.lang.invoke.MethodHandles;4import java.lang.invoke.VarHandle;5import java.util.concurrent.atomic.AtomicInteger;6 7/*8 * metaprogramming3VarHandles.java9 * ---------------------------------10 * VarHandle: atomic and ordered access to fields/arrays (Java 9+).11 *12 * DEFINITION:13 *   VarHandle is the modern replacement for many sun.misc.Unsafe field ops.14 *   It supports plain, volatile, and CAS (compare-and-set) access modes.15 *16 * KEY POINTS:17 *   - findVarHandle(Class, name, type) locates a field.18 *   - compareAndSet, getAndAdd, setRelease — building blocks for lock-free code.19 *   - AtomicInteger uses similar primitives internally.20 */21public class metaprogramming3VarHandles {22 23    static class Counter {24        volatile int count = 0;25    }26 27    public static void main(String[] args) throws Throwable {28        Counter c = new Counter();29        VarHandle vh = MethodHandles.lookup().findVarHandle(Counter.class, "count", int.class);30 31        vh.set(c, 10);32        System.out.println("set -> " + vh.get(c));33 34        boolean swapped = vh.compareAndSet(c, 10, 99);35        System.out.println("CAS 10->99: " + swapped + ", count=" + vh.get(c));36 37        int added = (int) vh.getAndAdd(c, 5);38        System.out.println("getAndAdd(5): previous=" + added + ", now=" + vh.get(c));39 40        // Compare with AtomicInteger (same idea, higher-level API)41        AtomicInteger ai = new AtomicInteger(0);42        ai.compareAndSet(0, 42);43        System.out.println("\nAtomicInteger CAS -> " + ai.get());44    }45}