首页 > 其他 > 详细

Unsafe源码及应用

时间:2021-01-19 00:45:01      阅读:40      评论:0      收藏:0      [点我收藏+]

1、Unsafe介绍及源码

Unsafe 类位于 sun.misc 包下,final修饰,无法被继承。

其主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。

 

Unsafe的使用是受限的,只有授信的代码才能使用,即JDK库里面的内才可以使用。

Unsafe 类是单例的,只有提供的静态方法 getUnsafe() 才能获取其实例,但是仅当调用getUnsafe方法的类为引导类加载器所加载时才合法,否则抛出SecurityException异常。

源码:

public final class Unsafe {

        // 单例对象
        private static final sun.misc.Unsafe theUnsafe;

        // 构造方法私有化,因此无法通过构造方法创建对象
        private Unsafe() {
        }

        @CallerSensitive
        public static sun.misc.Unsafe getUnsafe() {
            Class var0 = Reflection.getCallerClass();
            // 仅在引导类加载器`BootstrapClassLoader`加载时才合法
            if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
                throw new SecurityException("Unsafe");
            } else {
                return theUnsafe;
            }
        }
    }

 

但是可以通过反射获取单例对象 theUnsafe:

private static Unsafe reflectGetUnsafe() {
    try {
      Field field = Unsafe.class.getDeclaredField("theUnsafe");
      field.setAccessible(true);
      return (Unsafe) field.get(null);
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      return null;
    }
}

 

 

2、Unsafe应用

  1)CAS

    /**
     * CAS
     * @param var1 要修改field的对象
     * @param var2 对象中某field的偏移量
     * @param var4 期望值
     * @param var5 更新值
     * @return true|false
     */
    public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);

    public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

    public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);

 

 

END.

Unsafe源码及应用

原文:https://www.cnblogs.com/yangyongjie/p/14295804.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!