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
        }
    }
    
  • 相关阅读:
    document.getElementById(“id”)与$("#id")的区别
    sqlserver 无法打开备份文件a.bak
    xnconvert 图片转换工具
    基于jQuery的 h5移动端抽奖页面插件
    nodeJS 简单启动express服务器
    jquery 按钮切换插件
    微信判断手机有没有APP,有则打开,没有则跳到应用商城
    jQuery 文字向上轮播
    Node.js制作爬取简书内容的爬虫
    jquery手机端轮播图,点击放大手动轮播
  • 原文地址:https://www.cnblogs.com/fly-book/p/11368562.html
Copyright © 2011-2022 走看看