Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Variable Handle (VarHandle) trong Java 9 là gì?

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

Tạo VarHandle cho field

public class MyClass {
    public int publicField;
    private static String staticField;
}

// Tạo VarHandle
MethodHandles.Lookup lookup = MethodHandles.lookup();
VarHandle vhPublic = lookup.findVarHandle(MyClass.class, "publicField", int.class);
VarHandle vhStatic = lookup.findStaticVarHandle(MyClass.class, "staticField", String.class);

Ứng dụng

  • Low-level concurrency (atomic operations không cần synchronized).
  • Framework, library xây dựng memory-efficient data structure.
  • Serialization, deserialization động.
  • Off-heap memory access (kết hợp VarHandle + MemorySegment - Java 22+).

VarHandle là nền tảng cho java.util.concurrent.atomic mới (Java 9+: VarHandle based).

Phương thứcMô 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