Unsafe方法学习

介绍

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

unsafe提供的这些功能实现需要依赖本地方法。是通过Java中其他编程语言编写的方法。

Unsafe的创建

java 复制代码
private Unsafe() {
}

@CallerSensitive
public static Unsafe getUnsafe() {
    Class var0 = Reflection.getCallerClass();
    if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
        throw new SecurityException("Unsafe");
    } else {
        return theUnsafe;
    }
}

static {
        registerNatives();
        Reflection.registerMethodsToFilter(Unsafe.class, new String[]{"getUnsafe"});
        theUnsafe = new Unsafe();
        ARRAY_BOOLEAN_BASE_OFFSET = theUnsafe.arrayBaseOffset(boolean[].class);
        ARRAY_BYTE_BASE_OFFSET = theUnsafe.arrayBaseOffset(byte[].class);
        ARRAY_SHORT_BASE_OFFSET = theUnsafe.arrayBaseOffset(short[].class);
        ARRAY_CHAR_BASE_OFFSET = theUnsafe.arrayBaseOffset(char[].class);
        ARRAY_INT_BASE_OFFSET = theUnsafe.arrayBaseOffset(int[].class);
        ARRAY_LONG_BASE_OFFSET = theUnsafe.arrayBaseOffset(long[].class);
        ARRAY_FLOAT_BASE_OFFSET = theUnsafe.arrayBaseOffset(float[].class);
        ARRAY_DOUBLE_BASE_OFFSET = theUnsafe.arrayBaseOffset(double[].class);
        ARRAY_OBJECT_BASE_OFFSET = theUnsafe.arrayBaseOffset(Object[].class);
        ARRAY_BOOLEAN_INDEX_SCALE = theUnsafe.arrayIndexScale(boolean[].class);
        ARRAY_BYTE_INDEX_SCALE = theUnsafe.arrayIndexScale(byte[].class);
        ARRAY_SHORT_INDEX_SCALE = theUnsafe.arrayIndexScale(short[].class);
        ARRAY_CHAR_INDEX_SCALE = theUnsafe.arrayIndexScale(char[].class);
        ARRAY_INT_INDEX_SCALE = theUnsafe.arrayIndexScale(int[].class);
        ARRAY_LONG_INDEX_SCALE = theUnsafe.arrayIndexScale(long[].class);
        ARRAY_FLOAT_INDEX_SCALE = theUnsafe.arrayIndexScale(float[].class);
        ARRAY_DOUBLE_INDEX_SCALE = theUnsafe.arrayIndexScale(double[].class);
        ARRAY_OBJECT_INDEX_SCALE = theUnsafe.arrayIndexScale(Object[].class);
        ADDRESS_SIZE = theUnsafe.addressSize();
    }

Unsafe的创建是单例模式。采用的是饿汉式。

Unsafe方法的使用

java 复制代码
@CallerSensitive
public static Unsafe getUnsafe() {
    Class var0 = Reflection.getCallerClass();
    if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
        throw new SecurityException("Unsafe");
    } else {
        return theUnsafe;
    }
}

在代码中直接调用getUnsafe方法,会对调用者的classLoader进行检查,判断当前类是否由Bootstrap classLoader加载,如果不是就抛出SecurityException异常。只有启动类加载器才能够调用Unsafe类中的方法,防止这些代码在不可信的代码中被调用。

获取实例

  1. 利用反射获取Unsafe类中已经实例化完成的单例对象theUnsafe。
java 复制代码
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);
  1. 通过Java命令执行-Xbootclasspath/a把调用Unsafe相关方法的类A所在jar包路径追加到默认的bootstrap路径中,使得A被引导类加载器加载,从而通过Unsafe.getUnsafe发放安全的获取Unsafe实例。
java 复制代码
java -Xbootclasspath/a: ${path}   // 其中path为调用Unsafe相关方法的类所在jar包路径

Unsafe功能

Unsafe功能如下,可以被分为8类:

  1. 内存操作

  2. 内存屏障

  3. 对象操作

  4. 数组操作

  5. CAS操作
    CAS是CPU的原子指令,不会造成所谓的数据不一致问题,Unsafe提供的CAS方法底层实现即为CPU指令。
    在Unsafe类中,提供了compareAndSwapObject、compareAndSwapInt、compareAndSwapLong方法来实现对Object、int、long类型的CAS操作。
    以compareAndSwapInt方法为例:

    java 复制代码
    public final native boolean compareAndSwapInt(Object o, long offset,int expected,int x);

    参数o为需要更新的对象,offset是对象o中整形字段的偏移量,如果这个字段的值与excepted相同,则将字段的值设为x这个新值,并且此更新是不可被中断的,是一个原子操作。
    注: 被修改的对象的字段类型需要是基本数据类型。

  6. 线程调度

  7. Class操作

  8. 系统信息

参考

https://blog.csdn.net/weixin_46058921/article/details/143012338

相关推荐
lifallen几秒前
Avernet:Agent 的组织网络
人工智能·学习·ai·开源软件·ai编程
zzzzzz3101 分钟前
LLM 成本治理:从 token 账单到线上熔断,团队应该先做哪三件事?
人工智能·python·api
evans在进步24 分钟前
LeetCode 17:电话号码的字母组合——Java DFS 回溯法详解
java·leetcode·深度优先
2401_8504811727 分钟前
UVA10391
java
UQR34 分钟前
一、Java基础高频面试题
java·开发语言
AC赳赳老秦34 分钟前
网页公开附件自动采集:OpenClaw 批量下载页面内嵌 Word/Excel 附件,统一格式后结构化入库
java·python·word·php·excel·deepseek·openclaw
北斗落凡尘35 分钟前
LangGraph 入门实战(3)
python·langchain
上海云盾商务经理杨杨40 分钟前
Tomcat 弱配置漏洞渗透实战!批量 getshell 高频漏洞
java·web安全·tomcat
知识分享小能手41 分钟前
线性代数学习教程,从入门到精通,矩阵及其运算 — 完整知识点与详细推导(3)
学习·线性代数·矩阵
TAN-90°-1 小时前
Deep Learning for Computer Vision——Image Classification with Linear Classifiers
python·深度学习·算法·计算机视觉·线性回归