1、Unsafe介绍及源码
Unsafe 类位于 sun.misc 包下,final修饰,无法被继承。
其主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。
Unsafe的使用是受限的,只有授信的代码才能使用,即JDK库里面的内才可以使用。
Unsafe 类是单例的,只有提供的静态方法 getUnsafe() 才能获取其实例,但是仅当调用getUnsafe方法的类为引导类加载器所加载时才合法,否则抛出SecurityException异常。
源码:
public final class Unsafe { // 单例对象 private static final sun.misc.Unsafe theUnsafe; // 构造方法私有化,因此无法通过构造方法创建对象 private Unsafe() { } @CallerSensitive public static sun.misc.Unsafe getUnsafe() { Class var0 = Reflection.getCallerClass(); // 仅在引导类加载器`BootstrapClassLoader`加载时才合法 if (!VM.isSystemDomainLoader(var0.getClassLoader())) { throw new SecurityException("Unsafe"); } else { return theUnsafe; } } }
但是可以通过反射获取单例对象 theUnsafe:
private static Unsafe reflectGetUnsafe() { try { Field field = Unsafe.class.getDeclaredField("theUnsafe"); field.setAccessible(true); return (Unsafe) field.get(null); } catch (Exception e) { log.error(e.getMessage(), e); return null; } }
2、Unsafe应用
1)CAS
/** * CAS * @param var1 要修改field的对象 * @param var2 对象中某field的偏移量 * @param var4 期望值 * @param var5 更新值 * @return true|false */ public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5); public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5); public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);
END.
原文:https://www.cnblogs.com/yangyongjie/p/14295804.html