Variable handle is a typed reference to a variable, it support read and write access to the variable under a variety of access modes.
What are the supported variable types?
a. Instance Fields
b. Static Fields
c. Arrays
How Variables handles are modelled in Java?
Variable Handles are modelled in Java using java.lang.invoke.VarHandle.
Goal of Variable Handles
This feature is implemented to standardize the way in which methods of the following classes are invoked.
a. java.util.concurrent.atomic
b. sun.misc.Unsafe
Let me explain how to update the value of an instance field atomically.
public class AtomicCounter {
public int counter = 0;
}
As you see the definition of AtomicCounter class, it has instance field ‘counter’ which is initialized with value 0.
Get the VarHandle reference for counter field.
VarHandle publicIntHandle = MethodHandles.lookup().in(AtomicCounter.class).findVarHandle(AtomicCounter.class,"counter", int.class);
Get an instance of ‘AtomicCounter’.
AtomicCounter atomicCounter = new AtomicCounter();
Now access the ‘counter’ value associated with ‘atomicCounter’ using publicIntHandle.
int valueOfCounter = (int) publicIntHandle.get(atomicCounter);
Now atomically update the 'counter' value of AtomicCounter using getAndSet method of VarHandle.
publicIntHandle.getAndSet(atomicCounter, 10);
Find the below working applicaton.
AtomicCounter.java
package com.sample.app;
public class AtomicCounter {
public int counter = 0;
}
App.java
package com.sample.app;
import java.io.IOException;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
public class App {
public static void main(String args[]) throws IOException, NoSuchFieldException, IllegalAccessException {
VarHandle publicIntHandle = MethodHandles.lookup().in(AtomicCounter.class).findVarHandle(AtomicCounter.class,
"counter", int.class);
AtomicCounter atomicCounter = new AtomicCounter();
int valueOfCounter = (int) publicIntHandle.get(atomicCounter);
System.out.println("Counter : " + valueOfCounter);
int prevValue = (int) publicIntHandle.getAndSet(atomicCounter, 10);
valueOfCounter = (int) publicIntHandle.get(atomicCounter);
System.out.println("Previous Value : " + prevValue);
System.out.println("Counter : " + valueOfCounter);
}
}
Output
Counter : 0
Previous Value : 0
Counter : 10
Reference
https://openjdk.java.net/jeps/193
Previous Next Home
No comments:
Post a Comment