zoukankan      html  css  js  c++  java
  • sun.misc.Unsafe CAS

    日常写代码很少直接使用到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偏移量,就等于是某个字段的坐标位置(指针)。

  • 相关阅读:
    Ext JS 6开发实例(三) :主界面设计
    Ext JS 6开发实例(二) :使用CMD创建应用程序
    文件夹或者文件比对工具 Beyond Compare
    LIS问题(DP解法)---poj1631(模板)
    hdoj Max Sum Plus Plus(DP)
    A* 算法详解
    hdoj1043 Eight(逆向BFS+打表+康拓展开)
    hdoj2612 Find a way (bfs)
    luoguP3366 [模板] 最小生成树
    luoguP1196(带权并查集)
  • 原文地址:https://www.cnblogs.com/coderzl/p/7523908.html
Copyright © 2011-2022 走看看