Variable Handle คือตัวแปรหรือ reference to a set of variables รวมถึงคอมโพเนนต์อื่นๆ ของ static field non-static fields และ outer array elements ในโครงสร้างข้อมูล heap หมายถึง Variable Handle คล้ายกับ Method Handle ที่มีอยู่แล้ว แทนด้วยคลาส java.lang.invoke.VarHandle สร้าง Variable Handle objects ด้วย static factory method ของ java.lang.invoke.MethodHandles.Lookup ใช้เข้าถึง element เดียวใน array และ byte[] array ได้
ไวยากรณ์
public abstract class VarHandle extends Object
ตัวอย่างการใช้งาน
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);
varHandle.set(array, 2, 5);
printArray(array);
System.out.println(varHandle.get(array, 2));
}
private static void printArray(int[] array) {
System.out.println(Arrays.toString(array));
}
}
ผลลัพธ์
[0, 0, 0, 0, 0]
[0, 0, 5, 0, 0]
5
เมธอดสำคัญของ VarHandle
get(Object... args) - อ่านค่าset(Object... args, Object value) - เขียนค่าgetAndSet(Object... args, Object value) - อ่านแล้วเขียนใหม่ (atomic)compareAndSet(Object... args, Object expected, Object newValue) - CAS operationgetAndAdd(Object... args, Object value) - atomic addgetVolatile(Object... args) - volatile readsetVolatile(Object... args, Object value) - volatile write
การสร้าง VarHandle
// สำหรับ array
VarHandle arrayHandle = MethodHandles.arrayElementVarHandle(int[].class);
// สำหรับ static field
VarHandle staticHandle = MethodHandles.lookup()
.findStaticVarHandle(MyClass.class, "fieldName", int.class);
// สำหรับ instance field
VarHandle instanceHandle = MethodHandles.lookup()
.findVarHandle(MyClass.class, "fieldName", int.class);
VarHandle ให้ low-level memory access operations แบบ atomic และ ordered เหมาะสำหรับ concurrent programming ระดับสูง