
介绍unsafe类主要是用于提供一些用于执行低级别、不安全操作的方法如直接访问系统内存资源、自主管理内存资源等这些方法在提升Java运行效率增强Java语言底层资源操作能力方面起到了很大的作用。unsafe提供的这些功能实现需要依赖本地方法。是通过Java中其他编程语言编写的方法。Unsafe的创建privateUnsafe(){}CallerSensitivepublicstaticUnsafegetUnsafe(){Classvar0Reflection.getCallerClass();if(!VM.isSystemDomainLoader(var0.getClassLoader())){thrownewSecurityException(Unsafe);}else{returntheUnsafe;}}static{registerNatives();Reflection.registerMethodsToFilter(Unsafe.class,newString[]{getUnsafe});theUnsafenewUnsafe();ARRAY_BOOLEAN_BASE_OFFSETtheUnsafe.arrayBaseOffset(boolean[].class);ARRAY_BYTE_BASE_OFFSETtheUnsafe.arrayBaseOffset(byte[].class);ARRAY_SHORT_BASE_OFFSETtheUnsafe.arrayBaseOffset(short[].class);ARRAY_CHAR_BASE_OFFSETtheUnsafe.arrayBaseOffset(char[].class);ARRAY_INT_BASE_OFFSETtheUnsafe.arrayBaseOffset(int[].class);ARRAY_LONG_BASE_OFFSETtheUnsafe.arrayBaseOffset(long[].class);ARRAY_FLOAT_BASE_OFFSETtheUnsafe.arrayBaseOffset(float[].class);ARRAY_DOUBLE_BASE_OFFSETtheUnsafe.arrayBaseOffset(double[].class);ARRAY_OBJECT_BASE_OFFSETtheUnsafe.arrayBaseOffset(Object[].class);ARRAY_BOOLEAN_INDEX_SCALEtheUnsafe.arrayIndexScale(boolean[].class);ARRAY_BYTE_INDEX_SCALEtheUnsafe.arrayIndexScale(byte[].class);ARRAY_SHORT_INDEX_SCALEtheUnsafe.arrayIndexScale(short[].class);ARRAY_CHAR_INDEX_SCALEtheUnsafe.arrayIndexScale(char[].class);ARRAY_INT_INDEX_SCALEtheUnsafe.arrayIndexScale(int[].class);ARRAY_LONG_INDEX_SCALEtheUnsafe.arrayIndexScale(long[].class);ARRAY_FLOAT_INDEX_SCALEtheUnsafe.arrayIndexScale(float[].class);ARRAY_DOUBLE_INDEX_SCALEtheUnsafe.arrayIndexScale(double[].class);ARRAY_OBJECT_INDEX_SCALEtheUnsafe.arrayIndexScale(Object[].class);ADDRESS_SIZEtheUnsafe.addressSize();}Unsafe的创建是单例模式。采用的是饿汉式。Unsafe方法的使用CallerSensitivepublicstaticUnsafegetUnsafe(){Classvar0Reflection.getCallerClass();if(!VM.isSystemDomainLoader(var0.getClassLoader())){thrownewSecurityException(Unsafe);}else{returntheUnsafe;}}在代码中直接调用getUnsafe方法会对调用者的classLoader进行检查判断当前类是否由Bootstrap classLoader加载如果不是就抛出SecurityException异常。只有启动类加载器才能够调用Unsafe类中的方法防止这些代码在不可信的代码中被调用。获取实例利用反射获取Unsafe类中已经实例化完成的单例对象theUnsafe。FieldfieldUnsafe.class.getDeclaredField(theUnsafe);field.setAccessible(true);Unsafeunsafe(Unsafe)field.get(null);通过Java命令执行-Xbootclasspath/a把调用Unsafe相关方法的类A所在jar包路径追加到默认的bootstrap路径中使得A被引导类加载器加载从而通过Unsafe.getUnsafe发放安全的获取Unsafe实例。java-Xbootclasspath/a:${path}// 其中path为调用Unsafe相关方法的类所在jar包路径Unsafe功能Unsafe功能如下可以被分为8类内存操作内存屏障对象操作数组操作CAS操作CAS是CPU的原子指令不会造成所谓的数据不一致问题Unsafe提供的CAS方法底层实现即为CPU指令。在Unsafe类中提供了compareAndSwapObject、compareAndSwapInt、compareAndSwapLong方法来实现对Object、int、long类型的CAS操作。以compareAndSwapInt方法为例publicfinalnativebooleancompareAndSwapInt(Objecto,longoffset,intexpected,intx);参数o为需要更新的对象offset是对象o中整形字段的偏移量如果这个字段的值与excepted相同则将字段的值设为x这个新值并且此更新是不可被中断的是一个原子操作。注被修改的对象的字段类型需要是基本数据类型。线程调度Class操作系统信息参考https://blog.csdn.net/weixin_46058921/article/details/143012338