栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

VarHandle,可变句柄解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

VarHandle,可变句柄解析

JDK 9中新增的库,是java.util.concurrent.atomic和sun.misc.Unsafe操作的等价替代。VarHandle是通用的对象的域的引用句柄,提供原子的操作方法。
直接看用法即可。

// 对象域
private volatile int state;
private volatile Thread runner;
private volatile WaitNode waiters;
// 通用句柄
private static final VarHandle STATE;
private static final VarHandle RUNNER;
private static final VarHandle WAITERS;
// 在类中查找域的位置,并初始化
static {
    try {
        MethodHandles.Lookup l = MethodHandles.lookup();
        STATE = l.findVarHandle(FutureTask.class, "state", int.class);
        RUNNER = l.findVarHandle(FutureTask.class, "runner", Thread.class);
        WAITERS = l.findVarHandle(FutureTask.class, "waiters", WaitNode.class);
    } catch (ReflectiveOperationException e) {
        throw new ExceptionInInitializerError(e);
    }
}

它提供get, set, compareAndSet之类的原子操作。典型的用法如下,它首先传入实例引用(this),取得this对象中的state字段,对比是否等于NEW,如果是则赋值为COMPLETING,并且返回true,否则返回false。

if (STATE.compareAndSet(this, NEW, COMPLETING)) {

}

它的原理,我猜测和UNSAFE的版本非常像。

    // 句柄,其实也是相对于类的偏移量
    private static final long stateOffset;
    private static final long runnerOffset;
    private static final long waitersOffset;
    static {
        try {
            UNSAFE = sun.misc.Unsafe.getUnsafe();
            Class k = FutureTask.class;
            stateOffset = UNSAFE.objectFieldOffset
                (k.getDeclaredField("state"));
            runnerOffset = UNSAFE.objectFieldOffset
                (k.getDeclaredField("runner"));
            waitersOffset = UNSAFE.objectFieldOffset
                (k.getDeclaredField("waiters"));
        } catch (Exception e) {
            throw new Error(e);
        }
    }

来看UNSAFE版本如何完成compaeAndSet。它同样传入对象实例,字段偏移量,从而对某个字段进行原子的对比更新。

if (UNSAFE.compareAndSwapInt(this, stateOffset, NEW, COMPLETING))
参考

https://www.baeldung.com/java-variable-handles
https://segmentfault.com/a/1190000013544841
https://docs.oracle.com/javase/9/docs/api/java/lang/invoke/VarHandle.html#compareAndSet-java.lang.Object…-

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/695122.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号