读Unsafe类源码

简介: Unsafe类简介JUC中很多的实现都是调用了Unsafe类来实现的,所以这里阅读下该类的内容.Unsafe类包装了很多低级别的非安全性操作.虽然该类及其所有的方法都是public的,但是它只能被受信任的代码使用(也...

Unsafe类简介

JUC中很多的实现都是调用了Unsafe类来实现的,所以这里阅读下该类的内容.

Unsafe类包装了很多低级别的非安全性操作.虽然该类及其所有的方法都是public的,但是它只能被受信任的代码使用(也就是jdk中的代码)

读源码过程中,这里只会对部分方法进行说明,其余的方法要么类似要么不那么重要.

读源码

//构造方法私有化
private Unsafe() {}
//采用饿汉式单例
private static final Unsafe theUnsafe = new Unsafe();

//获取实例对象
public static Unsafe getUnsafe() {
    //获取调用该方法的调用者信息
    Class<?> caller = Reflection.getCallerClass();
    //判断该调用这的类加载器是否是系统类加载器(系统类加载器为null)
    if (!VM.isSystemDomainLoader(caller.getClassLoader()))
        throw new SecurityException("Unsafe");
    return theUnsafe;
}

//返回一个静态字段的偏移量
public native long staticFieldOffset(Field f);

//返回一个非静态字段字段的偏移量
public native long objectFieldOffset(Field f);

//获取给定对象指定偏移量的int值
public native int getInt(Object o, long offset);

//把给定对象指定偏移量上的值设置为整型变量x
public native void putInt(Object o, long offset, int x);

//获取给定内存地址上的byte值
public native byte    getByte(long address);

//把给定内存地址上的值设置为byte值x
public native void    putByte(long address, byte x);

//获取给定内存地址上的值,该值是表示一个内存地址
public native long getAddress(long address);

//分配一块本地内存,这块内存的大小便是给定的大小.这块内存的值是没有被初始化的
public native long allocateMemory(long bytes);

//定义一个类
public native Class<?> defineClass(String name, byte[] b, int off, int len,
                                       ClassLoader loader,
                                       ProtectionDomain protectionDomain);

//定义一个匿名类
public native Class<?> defineAnonymousClass(Class<?> hostClass, byte[] data, Object[] cpPatches);

//获取给定对象上的锁(jvm中有monitorenter 和 monitorexit两个指令)
public native void monitorEnter(Object o);

//释放给定对象上的锁(jvm中有monitorenter 和 monitorexit
public native void monitorExit(Object o);

//CAS操作,修改对象指定偏移量上的(CAS简介见末尾)
public final native boolean compareAndSwapObject(Object o, long offset,
                                                 Object expected,
                                                 Object x);

//CAS操作
public final native boolean compareAndSwapInt(Object o, long offset,
                                                  int expected,
                                                  int x);

//CAS操作
public final native boolean compareAndSwapLong(Object o, long offset,
                                                   long expected,
                                                   long x);

//获取被volatile关键字修饰的字段的值
public native Object getObjectVolatile(Object o, long offset);

//取消阻塞线程 thread,如果 thread 已经是非阻塞状态,
//那么下次对该 thread 进行park操作时就不会阻塞
public native void unpark(Object thread);

//阻塞当前线程,isAbsolute的作用不是很清楚.(如果该方法调用前在线程非阻塞情况下调用了unpart方法,那么此次调用该方法不会令当前线程阻塞)
public native void park(boolean isAbsolute, long time);

//CAS操作
public final int getAndAddInt(Object o, long offset, int delta) {
        int v;
        do {
            v = getIntVolatile(o, offset);
        } while (!compareAndSwapInt(o, offset, v, v + delta));
        return v;
}

CAS简介

CAS(Compare And Swap)比较并交换,是CPU级提供的功能.

比如IA64,X86指令集中就有cmpxchg指令来完成CAS功能
CAS指令需要3个操作数,分别是内存位置V,旧的预期值A,新值B. CAS指令执行时,当且仅当V符合旧的预期值A,处理器才用新值B更新V的值,否则部执行更新.最后无论是否更新V的值,都会返回V的旧值.CAS操作是一个原子操作.    —参考<<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版) 周志明 著>> 第13章 线程安全与锁优化 


欢迎关注订阅号:

目录
相关文章
|
2天前
|
云安全 人工智能 自然语言处理
AI说的每一句话,都靠谱吗?
阿里云提供AI全栈安全能力,其中针对AI输入与输出环节的安全合规挑战,我们构建了“开箱即用”与“按需增强”相结合的多层次、可配置的内容安全机制。
|
6天前
|
存储 人工智能 安全
AI 越智能,数据越危险?
阿里云提供AI全栈安全能力,为客户构建全链路数据保护体系,让企业敢用、能用、放心用
|
9天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
3天前
|
消息中间件 安全 NoSQL
阿里云通过中国信通院首批安全可信中间件评估
近日,由中国信通院主办的 2025(第五届)数字化转型发展大会在京举行。会上,“阿里云应用服务器软件 AliEE”、“消息队列软件 RocketMQ”、“云数据库 Tair”三款产品成功通过中国信通院“安全可信中间件”系列评估,成为首批获此认证的中间件产品。此次评估覆盖安全可信要求、功能完备性、安全防护能力、性能表现、可靠性与可维护性等核心指标,标志着阿里云中间件产品在多架构适配与安全能力上达到行业领先水平。
301 192
|
3天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
348 166
|
2天前
|
开发者
「玩透ESA」ESA启用和加速-ER在加速场景中的应用
本文介绍三种配置方法:通过“A鉴权”模板创建函数并设置触发器路由;在ESA上配置回源302跟随;以及自定义响应头。每步均配有详细截图指引,帮助开发者快速完成相关功能设置,提升服务安全性与灵活性。
303 2
|
8天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
457 93