在Java 9中使用VarHandle的正确方法?
我花了很多时间调查一些
Java 9的新功能,但是我没有找到任何有用和实际的例子.
考虑下一个创建VarHandle的代码片段: class Counter { int i; } class VarHandleInAction { static final VarHandle VH_COUNTER_FIELD_I; static { try { VH_COUNTER_FIELD_I = MethodHandles.lookup(). in(Counter.class). findVarHandle(Counter.class,"i",int.class); } catch (Exception e) { // ... } } } 但下一步呢?我的意思是,如何使用这个可变句柄?你能提供任何真实的例子吗? 解决方法
它被用于例如AtomicReference,其中以前在Java 8中使用了sun.misc.Unsafe:
public final void lazySet(V newValue) { unsafe.putOrderedObject(this,valueOffset,newValue); } public final boolean compareAndSet(V expect,V update) { return unsafe.compareAndSwapObject(this,expect,update); } 在这里,该指针与字段偏移一起用于访问字段.但这是不安全的,因为这个字段的偏移量可能会很长,你可能实际上正在访问完全不同的内容.然而,以这种方式执行性能优势(它告诉VM使用专门的CPU指令),并且因为其他人使用sun.misc.Unsafe,即使它是一个内部和不安全的API. VarHandles的一部分目的是用一个安全的等价物替换sun.misc.Unsafe中的操作.哪个在the JEP中说明:
所以在Java 9中,这些方法看起来像这样: public final void lazySet(V newValue) { VALUE.setRelease(this,newValue); } public final boolean compareAndSet(V expectedValue,V newValue) { return VALUE.compareAndSet(this,expectedValue,newValue); } 其中VALUE是一个VarHandle定义如下: private static final VarHandle VALUE; static { try { MethodHandles.Lookup l = MethodHandles.lookup(); VALUE = l.findVarHandle(AtomicReference.class,"value",Object.class); } catch (ReflectiveOperationException e) { throw new Error(e); } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |