Unsafe 类核心功能笔记

AI-摘要
LNotes-AI GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
Unsafe 类核心功能笔记
Liuxz一、Unsafe 类概述
- 定位:Java 底层 “后门级” 工具类,绕开 JVM 安全限制,直接操作内存、线程等底层资源。
- 风险:操作不当会导致 JVM 崩溃、内存泄漏,官方仅允许 JDK 内部类库使用,普通开发需谨慎。
- 获取方式:通过反射破解访问限制(因
Unsafe.getUnsafe()有安全校验,普通类调用会抛SecurityException)。
二、6 大核心功能与示例
1. 内存管理
- 能力:像 C 指针一样直接分配、释放、操作内存,支持堆外内存(不受 JVM 垃圾回收管理)。
- 核心方法:
allocateMemory(分配内存)、freeMemory(释放内存)、copyMemory(内存拷贝)、putInt/getInt(读写内存值)。 - 示例:
1 | Unsafe unsafe = getUnsafe(); |
2. 非常规对象实例化
- 能力:直接创建对象实例,且不执行构造方法和初始化逻辑(可绕过私有构造、
final限制)。 - 核心方法:
allocateInstance。 - 示例:
1 | class User { |
3. 操作对象的属性
- 能力:直接修改对象的私有属性(包括
final字段),打破 Java 封装性。 - 核心方法:
objectFieldOffset(获取字段内存偏移量)、putObject/getObject(读写字段值)。 - 示例:
1 | class Person { |
4. 操作数据元素
- 能力:直接操作数组元素的内存地址,实现 “超大数组” 或优化数组访问性能。
- 核心方法:
arrayBaseOffset(数组第一个元素偏移量)、arrayIndexScale(数组元素内存增量)。 - 示例:
1 | int[] arr = new int[3]; |
5. 多线程支持
- 能力:是 Java 并发包(
java.util.concurrent)的底层支撑,提供 CAS 操作、线程挂起 / 唤醒等能力。- CAS 操作:
compareAndSwapInt/compareAndSwapObject(原子比较并交换,AtomicInteger底层实现)。
示例(模拟AtomicInteger自增):
- CAS 操作:
1 | class MyAtomicInteger { |
线程挂起 / 唤醒:park(挂起线程)、unpark(唤醒线程)(LockSupport 底层实现)。
示例:
1 | Thread t = new Thread(() -> { |
6. 内存屏障
- 能力:阻止指令重排序,保证多线程下的内存可见性(类似
volatile关键字底层实现)。 - 核心方法:
loadFence(读屏障)、storeFence(写屏障)、fullFence(全屏障)。 - 示例(保证读可见性):
1 | class Data { private int value; } |
三、使用建议
- 适用场景:仅用于 JDK 内部类库、高性能框架(如 Netty、Hadoop)的底层开发。
- 替代方案:普通开发优先使用 Java 标准库的安全封装(如
AtomicInteger、LockSupport、volatile)。 - 兼容性:
sun.misc.Unsafe是非标准 API,JDK 9+ 可能迁移到jdk.internal.misc.Unsafe,需注意版本差异。
附:Unsafe 实例获取工具方法
1 | static Unsafe getUnsafe() { |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果




