Variable Handle (VarHandle) là tham chiếu đến một biến hoặc tập hợp biến: static field, non-static field, array element trong heap. Tương tự MethodHandle nhưng cho biến. Đại diện bởi java.lang.invoke.VarHandle.
Tạo VarHandle qua MethodHandles.Lookup static factory methods. Có thể truy cập single element trong array, byte[] array.
Cú pháp
public abstract class VarHandle extends Object
Ví dụ: VarHandle cho int[]
import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.util.Arrays;
public class VarHandleTest {
public static void main(String args[]) {
VarHandle varHandle = MethodHandles.arrayElementVarHandle(int[].class);
int[] array = new int[5];
printArray(array); // [0, 0, 0, 0, 0]
varHandle.set(array, 2, 5); // array[2] = 5
printArray(array); // [0, 0, 5, 0, 0]
System.out.println(varHandle.get(array, 2)); // 5
}
private static void printArray(int[] array) {
System.out.println(Arrays.toString(array));
}
}
Kết quả
[0, 0, 0, 0, 0] [0, 0, 5, 0, 0] 5
Các phương thức chính của VarHandle
| Phương thức | Mô tả |
|---|---|
get(Object... coords) | Đọc giá trị tại tọa độ |
set(Object... coords, Object value) | Ghi giá trị tại tọa độ |
getVolatile(Object... coords) | Đọc volatile |
setVolatile(Object... coords, Object value) | Ghi volatile |
compareAndSet(...) | CAS (compare-and-set) |
getAndAdd(...) | Atomic add |
getAndBitwiseOr(...) | Atomic bitwise OR |