Unsafe类作用
- 在任意内存地址处读写数据;
- 提供CAS操作;
Unsafe对象获取
Unsafe对象不能直接通过new Unsafe()或调用Unsafe.getUnsafe()获取。不能直接new Unsafe(),原因是Unsafe被设计成单例模式,构造方法是私有的;不能通过调用Unsafe.getUnsafe()获取,因为getUnsafe被设计成只能从引导类加载器(bootstrap class loader)加载。
获取方式: Unsafe类中有个私有的静态全局属性theUnsafe(Unsafe实例对象),通过反射,可以获取到该成员属性theUnsafe对应的Field对象,并将其设置为可访问,从而得到theUnsafe具体对象,如下代码:
// 通过反射得到theUnsafe对应的Field对象
Field field = Unsafe.class.getDeclaredField("theUnsafe");
// 设置该Field为可访问
field.setAccessible(true);
// 通过Field得到该Field对应的具体对象,传入null是因为该Field为static的
Unsafe unsafe = (Unsafe) field.get(null);
Unsafe类的API
- allocateInstance:不调用构造方法创建对象;
- objectFieldOffset:返回成员属性在内存中的地址相对于对象内存地址的偏移量;
- putLong,putInt,putDouble,putChar,putObject等方法:直接修改内存数据(可以越过访问权限);
- CAS操作的方法:compareAndSwapInt,compareAndSwapLong等,Atomic*类的实现基础。