package demo01; import sun.misc.Unsafe; import java.lang.reflect.Field; public class testUnsafe { static final Unsafe unsafe; static final long offset; private volatile long state = 0; static { try{ //暴力反射获得值,不然会报错 Field filed = Unsafe.class.getDeclaredField("theUnsafe"); filed.setAccessible(true); unsafe = (Unsafe)filed.get(null); Field state1 = testUnsafe.class.getDeclaredField("state"); offset = unsafe.objectFieldOffset(state1); }catch (Exception e){ e.printStackTrace(); throw new Error(); } } public static void main(String[] args) throws InterruptedException { testUnsafe tu = new testUnsafe(); /* //改变结果 0 变成 1 boolean b = unsafe.compareAndSwapInt(tu, offset, 0, 1); int intVolatile = unsafe.getIntVolatile(tu, offset); System.out.println(b + " 值是: "+intVolatile); //cas操作失败,因为当前内存的值是1不是2 (比较第三个参数) b = unsafe.compareAndSwapInt(tu, offset, 2, 1); intVolatile = unsafe.getIntVolatile(tu, offset); System.out.println(b + " 值是: "+intVolatile); */ for(int i = 0 ; i < 10 ; i ++){ new Thread(()->{ for(int j = 0 ; j < 10000 ; j ++){ increment(tu,offset); } }).start(); } Thread.sleep(1000); System.out.println(tu.state); } //自己的AtomicInteger的increment方法 public static void increment(Object o,long offset){ int oldVal = 1; // CAS来实现,比较oldVal do{ //获得原来的值 oldVal = unsafe.getIntVolatile(o, offset); }while(!unsafe.compareAndSwapInt(o,offset,oldVal,oldVal+1));//oldval加一 } }