zoukankan      html  css  js  c++  java
  • 并发编程之sun.misc.Unsafe类

    1、Unsafe知识点整理

    2、代码:

    package com.javabasic.unsafe;
    
    import java.lang.reflect.Field;
    
    import sun.misc.Unsafe;
    
    /**
     * Unsafe如何使用
     * 
     * 1、使用Unsafe.getUnsafe();获取对象会报错
     * Exception in thread "main" java.lang.ExceptionInInitializerError
    Caused by: java.lang.SecurityException: Unsafe
        at sun.misc.Unsafe.getUnsafe(Unsafe.java:90)
        at com.javabasic.unsafe.UnsafeTest1.<clinit>(UnsafeTest1.java:13)
     * 2、插卡源码,只要通过反射获取成员变量theUnsafe即可
     * @author win7
     *
     */
    public class UnsafeTest2 {
        
        //获取Unsafe实例对象
        static final Unsafe unsafe;
        
        //变量
        private volatile long state=0;
        
        //记录变量state在类UnsafeTest1中的偏移量
        static final long stateOffset;
        
        static {
            //获取state变量在类UnsafeTest1中的偏移值
            try {
                //使用反射获取Unsafe的成员变量theUnsafe
                Field field = Unsafe.class.getDeclaredField("theUnsafe");
                field.setAccessible(true);
                unsafe = (Unsafe)field.get(null);
                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 unsafeTest1 = new UnsafeTest2();
            boolean compareAndSwapInt = unsafe.compareAndSwapInt(unsafeTest1, stateOffset, 0, 1);
            System.out.println(compareAndSwapInt);
        }
    
    }

    3、eclipse中使用Unsafe编译报错

    只需要去掉编译校验即可。

  • 相关阅读:
    链接工作过程
    编译器工作过程
    图像边缘提取
    剑指32-1 从上到下打印二叉树
    剑指31 栈的压入 弹出序列
    剑指30 包含min函数的栈
    剑指28 对称的二叉树(暂留)
    asp.net core获取当前请求的完整url
    安装启动consul代理,consul后台管理
    asp.net core用命令方式启动项目
  • 原文地址:https://www.cnblogs.com/wangymd/p/12986585.html
Copyright © 2011-2022 走看看