变量句柄(VarHandle)是对于一个变量的强类型引用,或者是一组参数化定义的变量族,包括了静态字段、非静态字段、数组元素等,VarHandle支持不同访问模型下对于变量的访问,包括简单的read/write访问,volatile read/write访问,以及CAS访问。

VarHandle相比于传统的对于变量的并发操作具有巨大的优势,在JDK9引入了VarHandle之后,JUC包中对于变量的访问基本上都使用VarHandle,比如AQS中的CLH队列中使用到的变量等。

VarHandle具有两大优势,普通属性原子操作;比反射快,直接操纵二进制码。

public class T01_HelloVarHandle {
    int x = 8;
    private static VarHandle handle;

    static {
        try {
            //获取引用
            handle = MethodHandles.lookup().findVarHandle(T01_HelloVarHandle.class, "x", int.class);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        T01_HelloVarHandle t = new T01_HelloVarHandle();

        //plain read / write
        System.out.println((int) handle.get(t));
        handle.set(t, 9);
        System.out.println(t.x);

        //CAS操作
        handle.compareAndSet(t, 9, 10);
        System.out.println(t.x);

        //add
        handle.getAndAdd(t, 10);
        System.out.println(t.x);
    }
}

hhhhh