sun.misc.Unsafe类

Unsafe类作用

  1. 在任意内存地址处读写数据;
  2. 提供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

  1. allocateInstance:不调用构造方法创建对象;
  2. objectFieldOffset:返回成员属性在内存中的地址相对于对象内存地址的偏移量;
  3. putLong,putInt,putDouble,putChar,putObject等方法:直接修改内存数据(可以越过访问权限);
  4. CAS操作的方法:compareAndSwapInt,compareAndSwapLong等,Atomic*类的实现基础。

参考:https://www.cnblogs.com/chenpi/p/5389254.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值