zoukankan      html  css  js  c++  java
  • 12.Unsafe原子性操作

    import sun.misc.Unsafe;
    
    /**
     * JDK8
     * JDK 的此jar 包中的 Unsafe 类提供了硬件级别的原子性操作
     */
    public class UnsafeTest {
        //获得Unsafe的一个实例
        static final Unsafe unsafe1 = Unsafe.getUnsafe();
        static final long stateOffset;
        private volatile long state = 0;
    
        static {
            try {
                //获取 UnsafeTest 类里面的 state 变量, 在 UnsafeTest 对象里面的内存偏移量地址并将其保存到 stateOffset 变量中。
                //getDeclaredFields():获得某个类的所有声明的字段
                stateOffset = unsafe1.objectFieldOffset(UnsafeTest.class.getDeclaredField("state"));
            } catch (NoSuchFieldException e) {
                System.out.println(e.getLocalizedMessage());
                throw new Error(e);
            }
        }
        public static void main(String[] args){
            UnsafeTest unsafeTest = new UnsafeTest();
            //如果 test 对象中 内存偏移量为 stateOffset 的 state 变量的值为 0,则更新该值为 1
            boolean b = unsafe1.compareAndSwapInt(unsafeTest, stateOffset, 0, 1);
            System.out.println(b);
            //Exception in thread "main" java.lang.ExceptionInInitializerError
            //Caused by: java.lang.SecurityException: Unsafe
            //	at sun.misc.Unsafe.getUnsafe(Unsafe.java:90)
            //	at com.fly.two.UnsafeTest.<clinit>(UnsafeTest.java:10)
            //正常无法实例化 Unsafe 类
        }
    }
    
    
    import sun.misc.Unsafe;
    
    import java.lang.reflect.Field;
    
    import static com.fly.two.UnsafeTest.unsafe1;
    
    /**
     * JDK8
     * 通过反射来获取 Unsafe 实例方法。
     */
    public class UnsafeTest2 {
        //获得Unsafe的一个实例
        static final Unsafe unsafe;
        static final long stateOffset;
        private volatile long state = 0;
    
        static {
            try {
                //使用反射获取Unsafe的成员变量theUnsafe
                Field field = Unsafe.class.getDeclaredField("theUnsafe");
                //设置为可存取
                field.setAccessible(true);
                //获取该变量的值
                unsafe = (Unsafe) field.get(null);
                //获取 UnsafeTest 类里面的 state 变量, 在 UnsafeTest 对象里面的内存偏移量地址并将其保存到 stateOffset 变量中。
                //getDeclaredFields():获得某个类的所有声明的字段
                stateOffset = unsafe.objectFieldOffset(UnsafeTest2.class.getDeclaredField("state"));
            } catch (Exception e) {
                System.out.println(e.getLocalizedMessage());
                throw new Error(e);
            }
        }
        public static void main(String[] args){
            UnsafeTest2 unsafeTest = new UnsafeTest2();
            //如果 test 对象中 内存偏移量为 stateOffset 的 state 变量的值为 0,则更新该值为 1
            boolean b = unsafe.compareAndSwapInt(unsafeTest, stateOffset, 0, 1);
            System.out.println(b);//true
        }
    }
    
  • 相关阅读:
    DVWA——Brute Force(暴力破解)
    Sqli-Labs 闯关 less 54-65
    C#静态构造函数和析构函数片段化认知
    for、foreach和MoveNext循环效率粗比较
    实现一次请求加载多个js或者css
    asp.net使用httphandler打包多CSS或JS文件以加快页面加载速度
    C#向文件写、读数据
    计算机管理cmd命令行
    有二级目录的IIS配置
    WIN7 64位系统安装JDK并配置环境变量
  • 原文地址:https://www.cnblogs.com/fly-book/p/11368562.html
Copyright © 2011-2022 走看看