前面整理完 Unsafe
,不得不去了解下 java.lang.invoke.Varhandle
。如前面文章所说, Unsafe
是不建议开发者直接使用的,因为 Unsafe
所操作的并不属于Java标准,会容易带来一些安全性的问题。JDK9 之后,官方推荐使用 java.lang.invoke.Varhandle
来替代 Unsafe
大部分功能,对比 Unsafe
,Varhandle
有着相似的功能,但会更加安全,并且,在并发方面也提高了不少性能。
简介
Varhandle
是对变量或参数定义的变量系列的动态强类型引用,包括静态字段,非静态字段,数组元素或堆外数据结构的组件。 在各种访问模式下都支持访问这些变量,包括简单的读/写访问,volatile 的读/写访问以及 CAS (compare-and-set)访问。简单来说 Variable
就是对这些变量进行绑定,通过 Varhandle
直接对这些变量进行操作。
实例
- 目标实体类
public class Demo {
public int publicVar = 1;
protected int protectedVar = 2;
private int privateVar = 3;
public int[] arrayData = new int[]{
1, 2, 3};
@Override
public String toString() {
return "Demo{" +
"publicVar=" + publicVar +
", protectedVar=" + protectedVar +
", privateVar=" + privateVar +
", arrayData=" + Arrays.toString(arrayData) +
'}';
}
}
- 访问 private 成员
private static void privateDemo(