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.
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}