diff --git a/src/VarHandlerDemoRunner.java b/src/VarHandlerDemoRunner.java new file mode 100644 index 0000000..b13ac66 --- /dev/null +++ b/src/VarHandlerDemoRunner.java @@ -0,0 +1,39 @@ +import jvm.VarHandleDemo; + +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; + +public class VarHandlerDemoRunner { + + public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException { + VarHandleDemo instance = new VarHandleDemo(); + + //access private field + VarHandle varHandle = MethodHandles + .privateLookupIn(VarHandleDemo.class, MethodHandles.lookup()) + .findVarHandle(VarHandleDemo.class, "privateVar", int.class); + varHandle.set(instance, 33); + System.out.println(instance); + + //access protected field + VarHandle varHandle2 = MethodHandles + .privateLookupIn(VarHandleDemo.class,MethodHandles.lookup()) + .findVarHandle(VarHandleDemo.class, "protectedVar", int.class); + varHandle2.set(instance, 22); + System.out.println(instance); + + //access public field + VarHandle varHandle3 = MethodHandles.lookup() + .in(VarHandleDemo.class) + .findVarHandle(VarHandleDemo.class, "publicVar", int.class); + varHandle3.set(instance, 11); + System.out.println(instance); + + //access array + VarHandle varHandle4 = MethodHandles.arrayElementVarHandle(int[].class); + varHandle4.compareAndSet(instance.publicArrayData, 0, 1,11); + varHandle4.compareAndSet(instance.publicArrayData, 1, 2,22); + varHandle4.compareAndSet(instance.publicArrayData, 2, 3,33); + System.out.println(instance); + } +} diff --git a/src/main/java/jvm/VarHandleDemo.java b/src/main/java/jvm/VarHandleDemo.java new file mode 100644 index 0000000..dbe6ad1 --- /dev/null +++ b/src/main/java/jvm/VarHandleDemo.java @@ -0,0 +1,16 @@ +package jvm; + +import java.util.Arrays; + +public class VarHandleDemo { + + public int publicVar =1; + protected int protectedVar =2; + private int privateVar =3; + public int[] publicArrayData ={1,2,3}; + + @Override + public String toString() { + return STR."VarHandleDemo{publicVar=\{publicVar}, protectedVar=\{protectedVar}, privateVar=\{privateVar}, arrayData=\{Arrays.toString(publicArrayData)}}"; + } +} diff --git a/src/main/java/threaddemo/dataracing/SyncDemo.java b/src/main/java/threaddemo/dataracing/SyncDemo.java new file mode 100644 index 0000000..f343b48 --- /dev/null +++ b/src/main/java/threaddemo/dataracing/SyncDemo.java @@ -0,0 +1,70 @@ +package threaddemo.dataracing; + +public class SyncDemo { + + public synchronized static void methodA() { + System.out.println("enter static method methodA, sleep for 1s"); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("leaving methodA"); + } + + public synchronized static void methodB() { + System.out.println("enter static method methodB, sleep for 1s"); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("leaving methodB"); + } + + public synchronized void methodC() { + System.out.println("enter method methodC, sleep for 1s"); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("leaving methodC"); + } + + public void methodD() { + System.out.println("enter method methodD, sleep for 1s"); + synchronized (SyncDemo.class) { + System.out.println("start run methodD"); + try { + Thread.sleep(1000); + } catch ( InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("leaving methodD"); + } + + public static void main(String[] args) { + SyncDemo sd = new SyncDemo(); + long start = System.currentTimeMillis(); + Thread t1 = new Thread(SyncDemo::methodA); + Thread t2 = new Thread(SyncDemo::methodB); + Thread t3 = new Thread(sd::methodC); + Thread t4 = new Thread(sd::methodD); + + t1.start(); + t2.start(); + t3.start(); + t4.start(); + try { + t1.join(); + t2.join(); + t3.join(); + t4.join(); + System.out.println(STR."cost: \{System.currentTimeMillis() - start}"); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +}