Unsafe介绍Unsafe是位于sun.misc包下的一个类,主要提供一些执行低级和不安全操作的方法,比如直接访问系统内存资源,自我管理这些方法对提高Java的运行效率,增强Java语言对底层资源的操作能力起到了很大的作用。但是,由于Unsafe类使得Java语言具备了类似于C语言指针操作内存空间的能力,这无疑增加了程序中出现相关指针问题的风险。在程序中过多和不正确地使用Unsafe类,会增加程序出错的概率,使得Java这种安全语言不再“安全”,所以Unsafe的使用必须谨慎。java.util.concurrent.atomic包下的原子操作类基本都是使用Unsafe实现的。Unsafe提供的API大致可以分为内存操作、CAS、Class、对象操作、线程、系统信息获取、内存屏障、数组操作。java.util.concurrent.atomic包中与内存相关的CAS相关原子类基本使用UnsafeprivatestaticfinalUnsafeunsafe=Unsafe.getUnsafe();privatestaticfinallongvalueOffset;static{try{valueOffset=unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));}catch(Exceptionex){thrownewError(ex);}}publicfinalintgetAndSet(intnewValue){returnunsafe.getAndSetInt(this,valueOffset,newValue);}Thread相关的LockSupport类有applicationunpark,parkpublicstaticvoidpark(Objectblocker){Threadt=Thread.currentThread();setBlocker(t,blocker);UNSAFE.park(false,0L);setBlocker(t,null);}publicstaticvoidunpark(Threadthread){if(thread!=null)UNSAFE.unpark(thread);}ClassrelatedObjectoperation-relatedsystem-relatedmemorybarrierloadFence:保证这个barrier之前的所有读操作都已经完成。storeFence:保证这个barrier之前的所有写操作都已经完成。fullFence:保证在这个barrier之前的所有读写操作都已经完成。java8中有这个StampedLock类,应用了内存屏障功能。privatestaticfinalsun.misc.UnsafeU;static{try{U=sun.misc.Unsafe.getUnsafe();}catch(Exceptione){thrownewError(e);}}publicbooleanvalidate(longstamp){U.loadFence();return(stamp&SBITS)==(state&SBITS);}U.loadFence();Unsafe.javapublicfinalclassUnsafe{privatestaticnativevoidregisterNatives();static{registerNatives();sun.reflect.Reflection.registerMethodsToFilter(Unsafe.class,"getUnsafe");}privateUnsafe(){}privatestaticfinalUnsafetheUnsafe=newUnsafe();//...}获取Unsafe实例Unsafe类是final且单例的,Unsafe字段是private的;获取实例方法1FieldtheUnsafe=Unsafe.class.getDeclaredField("theUnsafe");theUnsafe.setAccessible(true);Unsafeunsafe=(Unsafe)theUnsafe.get(null);方法2privatestaticUnsafeunsafe=null;static{try{Constructorcons=Unsafe.class.getDeclaredConstructor();cons.setAccessible(true);不安全=cons.newInstance();}catch(Exceptione){e.printStackTrace();}}不安全的简单应用inti=0;publicstaticvoidmain(String[]args)throwsException{UnsafeDemod=newUnsafeDemo();//获取Unsafe实例FieldtheUnsafe=Unsafe.class.getDeclaredField("theUnsafe");theUnsafe.setAccessible(true);Unsafeunsafe=(Unsafe)theUnsafe.get(null);//获取Unsafe的实例变量classFieldf=UnsafeDemo.class.getDeclaredField("i");//获取字段相对于Java对象“起始地址”的偏移量longfieldOffset=unsafe.objectFieldOffset(f);System.out.println(fieldOffset);//设置值booleansuccess=unsafe.compareAndSwapInt(d,fieldOffset,0,10);System.out.println(success);System.out.println(d.i);}不安全对象操作privatestaticUnsafeunsafe=null;static{try{Constructorcons=Unsafe.class.getDeclaredConstructor();cons.setAccessible(true);unsafe=cons.newInstance();}catch(Exceptione){e.printStackTrace();}}publicstaticvoidallocate(){try{Personp=(Person)unsafe.allocateInstance(Person.class);p.setId("s001");System.out.println(p.getValue());System.out.println(p.getId());}catch(Exceptione){e.printStackTrace();}}执行结果:objecto操作二:privatePersonp=newPerson("1","张三");民众staticvoidmain(String[]args)throwsException{UnSafeObjectDemod=newUnSafeObjectDemo();Fieldfield=Unsafe.class.getDeclaredField("theUnsafe");field.setAccessible(true);Unsafeunsafe=(不安全)field.get(null);Fieldf=d.getClass().getDeclaredField("p");longoffset=unsafe.objectFieldOffset(f);System.out.println(offset);booleanres=unsafe.compareAndSwapObject(d,offset,d.p,newPerson("2","李四"));System.out.println(res);System.out.println(d.p.getName());}Unsafe创建一个对象,当你不知道要使用的对象有什么构造函数,或者你不知道不想使用已有的对象当构造函数创建一个对象时,可以使用如下方法:getConstructor());cons.setAccessible(true);Teachert=cons.newInstance();System.out.println(t);Unsafe简单实现原子操作类publicclassAtomicCount{privatestaticUnsafeunsafe;privateintvalue;privatestaticlongvalueOffset;static{try{FieldtheUnsafe=Unsafe.class.getDeclaredField(";theUnsafe");theUnsafe.setAccessible(true);unsafe=(Unsafe)theUnsafe.get(null);Fieldf=AtomicCount.class.getDeclaredField("value");valueOffset=unsafe.objectFieldOffset(f);}catch(Exceptione){e.printStackTrace();}}publicAtomicCount(intvalue){this.value=value;}publicfinalintget(){returnvalue;}publicfinalintgetAndIncrement(){returnunsafe.getAndAddInt(this,valueOffset,1);}}完成!!!