博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sun.misc.Unsafe CAS
阅读量:6080 次
发布时间:2019-06-20

本文共 1194 字,大约阅读时间需要 3 分钟。

日常写代码很少直接使用到Unsafe,时常看jdk的时候,遇到这个使用场景。刚挑选了一个比较熟悉的CAS来做一个api使用测试。

public class UnsafeTest {    private String name = "a";    private String addr = "b";    private int age = 11;    private int id = 2;    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {        //Unsafe unsafe = Unsafe.getUnsafe();  //不允许外部使用,会抛异常        Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe");        theUnsafeInstance.setAccessible(true);        Unsafe unsafe =  (Unsafe) theUnsafeInstance.get(Unsafe.class);        long ageOffset = unsafe.objectFieldOffset                (UnsafeTest.class.getDeclaredField("age"));        UnsafeTest unsafeTest = new UnsafeTest();        System.out.println(unsafe.compareAndSwapInt(unsafeTest,ageOffset,11,22));        System.out.println(unsafeTest.age);    }}

由于Unsafe.getUnsafe()是不允许外部使用的,会抛出java.lang.SecurityException: Unsafe异常。所以利用反射获取Unsafe实例。

compareAndSwapInt(Object var1, long var2, int var4, int var5)有四个参数。

  • 第一个是被修改的对象
  • 第三个是被修改的属性当前的期望值
  • 第四个是计划要修改的值

其实就是,当var1对象的某个属性,值为var4,就修改为var5.这里说了,是某个属性,而第二个参数则是用来标注所需要修改的属性的offset了。

通俗来讲,就是offset偏移量,就等于是某个字段的坐标位置(指针)。

转载于:https://www.cnblogs.com/coderzl/p/7523908.html

你可能感兴趣的文章
命运多舛、前途未卜,共享经济年终盘点之网约车
查看>>
研究人员研制出可有效抑制艾滋病病毒的新药,可让病毒几乎检测不出来
查看>>
什么是区块链?超级账本 Brian Behlendorf 从五个方面教你认识
查看>>
独家揭秘:2017中国人工智能与机器人创新大会大咖云集
查看>>
聊聊Dubbo - Dubbo可扩展机制实战
查看>>
马斯克生日之际,特斯拉正式交付30辆顶配版Model 3
查看>>
Oracle DBA 增值 PostgreSQL,Greenplum 学习计划
查看>>
Appuploader的安装介绍
查看>>
附录B 安装MySql数据库
查看>>
设置为disabled不可用的表单元素的value值无法发送
查看>>
CentOS 6.5 ipesc下Openswan实现双IDC互联
查看>>
小谈React、React Native、React Web
查看>>
[原创]Camtasia Studio 6.0录制视频时鼠标闪烁的解决办法
查看>>
Android Activity 四种启动模式
查看>>
SQL Server 2014新特性——Buffer Pool扩展
查看>>
需求的陷阱
查看>>
系统架构简单图解
查看>>
浅谈加密技术
查看>>
centOS7下安装GUI图形界面
查看>>
一张图透析阿里云API应用创新大赛
查看>>