Unsafe类真的无法无天?深入剖析Java外部内存访问的安全边界

(1w字一篇理解透Unsafe类)Java魔法类:Unsafe详解 文章介绍了Unsafe类的概念,功能,使用方法,包括了内存操作,内存屏障,对象操作,数组操作,CAS操作,线程调度,Class操作,系统信息等。 阅读详情

第一章:Unsafe类真的无法无天?重新定义Java外部内存的安全认知

Java中的`sun.misc.Unsafe`类长久以来被视为“黑魔法”工具,因其能绕过JVM常规限制直接操作内存。尽管名字暗示其危险性,但它的存在并非设计缺陷,而是为高性能库和框架提供底层支持,如Java并发包(java.util.concurrent)和Netty。

Unsafe的核心能力

通过Unsafe,开发者可执行以下操作:
  • 直接分配和释放堆外内存
  • 执行CAS(比较并交换)操作,实现无锁算法
  • 绕过构造器创建对象实例
  • 读写任意内存地址的数据

获取Unsafe实例的典型方式

由于Unsafe被设计为仅限内部使用,无法通过常规new或静态方法获取。常见反射方式如下:

import sun.misc.Unsafe;
import java.lang.reflect.Field;

public class UnsafeExample {
    private static final Unsafe UNSAFE;

    static {
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            UNSAFE = (Unsafe) field.get(null); // 获取单例实例
        } catch (Exception e) {
            throw new RuntimeException("Unable to access Unsafe", e);
        }
    }

    public static void main(String[] args) {
        long address = UNSAFE.allocateMemory(8); // 分配8字节堆外内存
        UNSAFE.putLong(address, 123456789L);    // 写入long值
        System.out.println(UNSAFE.getLong(address)); // 输出: 123456789
        UNSAFE.freeMemory(address);             // 释放内存
    }
}
上述代码展示了如何通过反射访问Unsafe,并进行堆外内存的分配与读写。需注意:allocateMemory不会受到GC管理,必须手动调用freeMemory,否则将导致内存泄漏。

安全与风险并存

虽然Unsafe提供了极致性能,但代价是失去自动内存管理和边界检查。错误使用可能导致JVM崩溃。下表列出常见操作及其风险等级:
操作用途风险等级
allocateMemory堆外内存分配高
compareAndSwapInt无锁同步中
putObject直接内存写入高

2.1 Unsafe类的核心功能与内存操作机制

直接内存访问能力
Unsafe类提供了绕过JVM限制的底层内存操作接口,允许Java程序直接读写任意内存地址。这种能力在高性能框架如Netty和Disruptor中被广泛用于实现零拷贝与堆外缓存。

// 获取Unsafe实例(需通过反射)
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
Unsafe unsafe = (Unsafe) field.get(null);

// 分配并写入4字节整数到堆外内存
long address = unsafe.allocateMemory(4);
unsafe.putInt(address, 12345678);
上述代码展示了如何获取Unsafe实例及进行堆外内存写入。`allocateMemory`分配指定字节数的本地内存,`putInt`将整型值写入指定地址,避免了对象封装开销。
内存屏障与同步控制
Unsafe提供`park`、`unpark`及内存屏障方法,支撑Java并发包中线程调度与可见性控制,是实现LockSupport与AQS框架的基石。

2.2 堆外内存分配与释放的实践与风险控制

堆外内存的基本操作
在高性能场景中,堆外内存可避免GC停顿。Java通过Unsafe或ByteBuffer.allocateDirect实现分配:

ByteBuffer buffer = ByteBuffer.allocateDirect(1024 * 1024); // 分配1MB
该方式由操作系统直接管理内存,需谨慎控制生命周期。
资源泄漏风险与控制
未及时释放将导致内存溢出。推荐使用Cleaner或try-with-resources封装:
  • 显式调用Cleaner.register()注册清理任务
  • 结合PhantomReference追踪对象回收状态
性能对比参考
方式分配速度回收成本
堆内内存快低
堆外内存慢高(需手动)

2.3 直接内存访问中的指针运算与边界检查缺失

在直接内存访问(DMA)场景中,指针运算常用于高效遍历数据缓冲区。然而,由于缺乏运行时边界检查,不当的指针操作极易引发内存越界访问。
指针越界的风险示例

char *buffer = (char *)malloc(256);
char *ptr = buffer;
for (int i = 0; i <= 256; i++) {  // 错误:i 取值到 256
    *(ptr + i) = 0;  // 越界写入
}
上述代码中,循环执行257次,最后一次写入超出分配的256字节范围,导致未定义行为。C语言不自动进行数组或指针边界检测,开发者需手动确保访问合法性。
常见防护策略对比
策略实现方式有效性
静态分析编译期检查指针范围中
ASan工具运行时内存监控高
手动边界校验代码中显式判断依赖开发规范

2.4 利用Unsafe绕过JVM限制的典型安全漏洞案例

Java中的`sun.misc.Unsafe`类提供了直接操作内存、分配对象、修改字段偏移等底层能力,若被恶意利用,可绕过JVM的安全检查机制。
反射获取Unsafe实例
攻击者常通过反射机制获取受限的`Unsafe`单例:

Field f = Unsafe.class.getDeclaredField("theUnsafe");
f.setAccessible(true);
Unsafe unsafe = (Unsafe) f.get(null);
上述代码通过反射访问私有静态字段`theUnsafe`,绕过正常访问控制,获得对系统内存的直接操控权。
构造非法对象实例
利用`allocateInstance()`可跳过构造函数创建对象,破坏单例模式或初始化逻辑:
  • 绕过构造器中的安全校验逻辑
  • 生成未初始化状态的敏感类实例
内存写入攻击示例
结合`putLong()`与对象偏移,可篡改目标字段值,实现权限提升或绕过认证。此类行为在反序列化漏洞中尤为危险。

2.5 外部内存操作中的线程安全与内存可见性问题

在多线程环境下操作外部内存(如堆外内存或共享内存映射文件)时,线程安全与内存可见性成为关键挑战。多个线程可能同时读写同一内存区域,若缺乏同步机制,将导致数据竞争和不一致状态。
内存可见性问题示例

var data int
var ready bool

func worker() {
    for !ready { // 可能永远看不到主线程的更新
        runtime.Gosched()
    }
    fmt.Println(data) // 期望输出 42,但可能读到零值
}

func main() {
    go worker()
    data = 42
    ready = true
    time.Sleep(time.Second)
}
上述代码中,ready 和 data 的写入可能因 CPU 缓存未及时刷新而对 worker 线程不可见,造成逻辑错误。
解决方案:使用原子操作或内存屏障
  • 通过 sync/atomic 包保证变量更新的原子性和可见性
  • 利用 atomic.StoreUint32 插入内存屏障,强制刷新缓存
  • 结合 Once 或 Cond 实现安全的发布模式

3.1 基于Cleaner和PhantomReference的资源自动回收机制

Java 提供了多种机制来管理堆外内存与本地资源的自动释放,其中 `Cleaner` 和 `PhantomReference` 是实现对象 finalize 替代方案的核心工具。
PhantomReference 与引用队列
虚引用必须关联引用队列,当对象仅剩虚引用时,GC 会将其加入队列,通知清理线程执行资源回收:

ReferenceQueue<Resource> queue = new ReferenceQueue<>();
PhantomReference<Resource> ref = new PhantomReference<>(resource, queue);

// 在专用线程中轮询
Reference<? extends Resource> cleared = queue.remove();
cleanUp(cleared); // 执行实际资源释放
此机制避免了传统 finalize() 的性能问题与不确定性,确保资源及时释放。
Cleaner 的使用方式
`Cleaner` 是 `PhantomReference` 的高层封装,通过注册可运行任务实现自动清理:
  • 每个 Cleaner 实例关联一个 cleanable 对象
  • 调用 clean() 方法触发资源释放
  • 内部基于虚引用与守护线程协作
该机制广泛应用于 NIO 中的直接缓冲区清理,保障系统级资源不泄露。

3.2 使用VarHandle替代Unsafe进行安全原子操作

在Java中,sun.misc.Unsafe曾被广泛用于高性能原子操作,但其不受控的内存访问带来了严重的安全隐患。为解决这一问题,Java 9引入了VarHandle,提供类型安全、内存语义明确的变量访问机制。
VarHandle的核心优势
  • 类型安全:编译期检查操作的合法性
  • 内存语义可控:支持volatile、acquire、release等内存排序选项
  • 模块化兼容:不违反Java模块系统封装原则
代码示例:原子更新字段

public class Counter {
    private volatile int value;
    private static final VarHandle VALUE_HANDLE;

    static {
        try {
            VALUE_HANDLE = MethodHandles.lookup()
                .findVarHandle(Counter.class, "value", int.class);
        } catch (ReflectiveOperationException e) {
            throw new ExceptionInInitializerError(e);
        }
    }

    public void increment() {
        VALUE_HANDLE.getAndAdd(this, 1); // 原子加1
    }
}
上述代码通过MethodHandles.lookup()获取value字段的VarHandle,调用getAndAdd实现无锁原子递增,兼具性能与安全性。

3.3 Project Panama对传统Unsafe用法的演进与限制

Project Panama旨在桥接Java与原生代码,逐步替代`sun.misc.Unsafe`中不安全且难以维护的操作。通过引入**Foreign Function & Memory API**,开发者可安全地调用本地函数并管理外部内存。
从Unsafe到Panama的演进
传统`Unsafe`直接操作内存地址,易引发崩溃。Panama则通过`MemorySegment`和`SymbolLookup`提供类型安全的接口:

try (MemorySegment segment = MemorySegment.allocateNative(1024)) {
    segment.set(ValueLayout.JAVA_INT, 0, 42);
    int value = segment.get(ValueLayout.JAVA_INT, 0);
}
上述代码分配1KB本地内存,并以类型安全方式读写整型值。`ValueLayout.JAVA_INT`确保数据格式正确,避免了指针误用。
关键限制与约束
  • Panama仍处于预览阶段,API可能变更
  • 跨平台调用需显式声明ABI规范
  • 资源管理依赖try-with-resources,否则引发内存泄漏

4.1 构建基于MemorySegment的安全外部内存访问模型

Java 17引入的MemorySegment为直接内存、堆外内存提供了统一且安全的访问方式。通过封装原始内存地址,结合清理机制与边界检查,有效避免了传统sun.misc.Unsafe带来的内存泄漏与越界风险。
核心特性与优势
  • 自动生命周期管理:依赖Cleaner或try-with-resources确保内存释放
  • 跨平台抽象:屏蔽底层操作系统差异,统一访问接口
  • 类型安全访问:配合MemoryLayout实现结构化读写
代码示例:创建并访问本地内存段
MemorySegment segment = MemorySegment.allocateNative(1024);
segment.set(ValueLayout.JAVA_INT, 0, 42);
int value = segment.get(ValueLayout.JAVA_INT, 0);
上述代码分配1KB本地内存,将整型值42写入起始偏移,并读回验证。其中ValueLayout.JAVA_INT确保类型对齐与字节序正确,set/get方法内置边界检查,防止非法访问。
访问控制机制
流程图:申请内存 → 绑定作用域 → 访问检查(权限+边界) → 自动回收

4.2 使用Foreign Function & Memory API实现受控本地调用

Java 平台长期以来依赖 JNI 实现与本地代码的交互,但其复杂性和安全隐患促使新机制的诞生。Foreign Function & Memory API(FFM API)作为 Project Panama 的核心组件,提供了一种类型安全、内存可控的替代方案。
核心特性与优势
  • 消除 JNI 的脆弱绑定,提升跨语言互操作性
  • 通过 MemorySegment 和 MemoryLayout 精确管理本地内存
  • 支持自动资源清理,防止内存泄漏
示例:调用本地 sqrt 函数
MethodHandle sqrt = CLinker.getInstance().downcallHandle(
    CFunctionDescriptor.of(C_DOUBLE, C_DOUBLE),
    SymbolLookup.ofLibrary("m").lookup("sqrt")
);
double result = (double) sqrt.invoke(25.0); // 返回 5.0
上述代码通过 downcallHandle 绑定 C 标准库中的 sqrt 函数,CFunctionDescriptor 定义参数与返回类型,确保类型安全。调用过程无需编写 native 方法或额外动态库。

4.3 内存段生命周期管理与非法访问异常处理

在现代系统编程中,内存段的生命周期必须精确控制,以避免资源泄漏或悬空指针。通过RAII(Resource Acquisition Is Initialization)机制,可在对象构造时分配内存段,析构时自动释放。
内存段状态迁移
一个内存段通常经历“未分配 → 已分配 → 使用中 → 释放”四个阶段。任意阶段间的非法跳转将触发异常。
非法访问检测示例

type MemorySegment struct {
    data []byte
    valid bool
}

func (m *MemorySegment) Read(addr int) (byte, error) {
    if !m.valid {
        return 0, errors.New("segment fault: access to freed memory")
    }
    if addr < 0 || addr >= len(m.data) {
        return 0, errors.New("segment fault: address out of bounds")
    }
    return m.data[addr], nil
}
该代码在读取前检查有效性与地址边界,防止非法访问。m.valid 标志由显式 Free() 操作置为 false,阻止后续使用。
常见异常类型对照表
异常类型触发条件
Segmentation Fault访问已释放段
Bus Error对齐错误访问

4.4 从Unsafe到JEP 442:平滑迁移路径与兼容性策略

Java平台长期依赖`sun.misc.Unsafe`提供底层内存和线程操作,但其不受控的使用带来了安全与维护隐患。JEP 442(Foreign Function & Memory API)作为标准化替代方案,提供了安全、高效且可移植的外部函数调用能力。
核心迁移策略
  • 识别现有Unsafe调用点,如直接内存访问或CAS操作
  • 使用JEP 442中的MemorySegment和SymbolLookup重构代码
  • 通过封装适配层实现新旧API共存
// 使用JEP 442分配本地内存并写入数据
try (MemorySession session = MemorySession.openConfined()) {
    MemorySegment segment = session.allocate(4);
    segment.set(ValueLayout.JAVA_INT, 0, 42);
}
上述代码利用MemorySession管理生命周期,确保资源自动释放;MemorySegment.set()替代Unsafe的putInt,具备边界检查与类型安全优势。
兼容性保障
通过条件加载机制,在不同JDK版本中动态选择实现路径,确保跨版本平稳运行。

第五章:Java外部内存安全管理的未来演进与最佳实践

随着 Java 17 中正式引入 Foreign Memory API 和后续在 Java 21 中增强的虚拟线程支持,外部内存管理正逐步摆脱对 JNI 的依赖,转向更安全、高效的编程模型。通过 `MemorySegment` 和 `MemoryLayout`,开发者能够以纯 Java 方式访问堆外内存,同时获得自动生命周期管理和边界检查。
避免内存泄漏的资源管理策略
使用 `try-with-resources` 确保 `MemorySegment` 被及时释放:
try (MemorySegment segment = MemorySegment.allocateNative(1024)) {
    MemoryAccess.setByteAtOffset(segment, 0, (byte) 42);
    // 使用完毕后自动清理
} // 自动调用 close()
跨语言互操作中的安全约束
在调用本地库时,应使用 `SymbolLookup` 安全绑定函数指针,并限制内存访问范围:
  • 始终验证 native 库来源,防止加载恶意二进制文件
  • 使用 `ResourceScope` 控制内存段生命周期,避免作用域逃逸
  • 启用 JVM 参数 `-XX:+FreeDirtyCardTable` 提升回收效率
生产环境监控与调优建议
指标推荐阈值监控工具
直接内存使用量< 80% -Xmx 设置值JConsole / Prometheus + JMX Exporter
MemorySegment 分配频率< 1000次/秒Async-Profiler + Flame Graph

流程:应用请求 → 检查作用域 → 分配 MemorySegment → 绑定 ResourceScope → 使用完成 → 显式或自动关闭 → 触发清理钩子

采用虚拟线程配合异步 I/O 可显著降低高并发下对外部内存的竞争压力。例如,在处理数万个并发文件读取任务时,结合 `StructuredTaskScope` 与 `MemorySegment.mapFile()` 实现零拷贝安全映射。
Java Unsafe 类详解 cg Unsafe是 Java 提供的一个类,包含一些可以直接操作内存和线程的底层方法。与其名字一致,这些方法并不安全,因为它们可以直接访问和修改内存,而不受 JVM 的管理和约束。因此,使用Unsafe可能导致程序崩溃,数据损坏,甚至是安全问题。在 JVM 中,通常对内存和线程操作进行严格的限制,以确保代码的安全性和稳定性。但在某些情况下,我们需要绕过这些限制,例如进行高效的内存操作、开发高性能的并发数据结构或实现一些底层框架功能。Unsafe。 阅读详情

相关推荐

Java魔法类Unsafe详解

而在volatile写入中,使用的StoreLoad屏障,该屏障确保Store1立刻刷新数据到内存,这一操作先于Load2及后续的装载指令,并且,StoreLoad屏障会使该屏障之前的所有内存访问指令,包括存储指令和访问指令全部完成之后,才执行该屏障之后的内存访问指令。在上面的代码中,首先读取一个class文件并通过文件流将它转化为字节数组,之后使用defineClass方法动态的创建了一个类,并在后续完成了它的实例化工作,流程如下图所示,并且通过这种方式创建的类,会跳过JVM的所有安全检查。

zhuangjiaxing的博客 1016

Java中的Unsafe类详解

Unsafe 类提供了一些能够绕过 Java 语言安全机制的方法,例如直接操作内存、CAS(比较并交换)操作、分配和释放内存等。这使得开发者可以在某些情况下获得更高的性能,但同时也需要承担更大的风险和责任。

JAVA开发区的博客 3799

基于bootstrap+Java的图书管理系统(任务书)

10] 倪甜弟,周晓波,王相喜.基于JSP图书馆自习室预约系统的设计与实现[J].现代计算机, 2024, 30(9):117-120.DOI:10.3969/j.issn.1007-1423.2024.09.023.[2] 陈明雪,赵勇,周小丽,等.基于Node.js和Bootstrap的图书管理系统设计与研究[J].现代信息科技, 2021, 5(24):4.[9] 杨婷婷.基于VOSviewer的图书馆管理系统研究的可视化分析[J].现代信息科技, 2023, 7(3):123-126.

毕业作品网站 649

Unsafe类滥用有多危险?,深入剖析Java外部内存权限漏洞与防护

深入解析Java外部内存访问权限风险与防护策略,揭示Unsafe类滥用导致的安全漏洞。涵盖JNI调用、堆外内存管理等场景,提供权限控制与代码隔离核心方法,提升系统安全性,值得收藏。

ProceChat的博客 810

fpga进阶--时序约束

1、基础概念 1.1 建立(setup)/保持(hold)时间 上述的锁存沿会将数据保存下来,但是必须要满足一定的条件: 建立时间Tsu:在时钟有效沿之前,数据必须保持稳定的最小时间; 保持时间Th:在时钟有效沿之后,数据必须保持稳定的最小时间; 1.2 亚稳态(Metastability) 亚稳态是由于违背了触发器的建立和保持时间而产生的,设计中任何一个触发器都有特定的建立和保持时间,在时钟上升沿前后的这段时间窗口内,数据输入信号必须保持稳定。如果信号在这段时间内发生了变化,那么输...

HHH的博客 2443

unity中判断是否联网,判断网络状态的两种方式

unity中判断是否联网,判断网络状态的两种方式

wla2996gpy032的博客 1877

Java中的Unsafe类

介绍并总结了Unsafe的几类功能方法,比如并发相关,内存相关,Class相关,并举例说明

在路上 2932

基于Python的信用卡欺诈检测机器学习案例报告

当今时代,在线支付已成为一种高效便捷的支付方式,我们可以突破时间和空间的限制,输入我们的信用卡各项信息就可以完成在线支付。但随之而来的是这种支付方式也具备一定的风险性,我们无法辨别对方是否是恶意套取我们资金的非法分子。当信用卡信息数据泄露导致金钱失窃并最终失去客户忠诚度和公司声誉时,组织、消费者、银行和商家都会面临风险。2017 年,未经授权的信用卡操作达到了惊人的 1670 万受害者。此外,据美国联邦贸易委员会 (FTC) 报告,2017 年信用卡欺诈索赔数量比上一年高出 40%。

weixin_45673389的博客 6696

Java 魔法类 Unsafe 详解

Java 魔法类 Unsafe 详解

专注IT技术免费指导以及想、项目分享 1174

【王道训练营 C/C++方向基础 60 题(31-40)】

王道训练营 C/C++方向基础 60 题(31-40)

qq_55805517的博客 3067

MCP+A2A:从实验室到生产环境的落地之旅

本文通过实际项目中的落地案例,展示了 MCP+A2A 协议结合使用的强大功能和广泛适用性。同时,我们也探讨了开发者社区的贡献、与其他技术的融合,以及未来技术趋势的展望。希望本文能够帮助读者更好地理解如何将这一架构从实验室推向生产环境,推动 AI 技术的实际应用。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1495

Java Unsafe 类详解

Unsafe类在 Java 中提供了一种底层的操作机制,允许开发者直接访问和操作内存、线程和对象。尽管Unsafe提供了许多强大的功能,但由于其操作的不安全性,使用时需要非常谨慎。在实际开发中,应尽量避免滥用Unsafe,确保代码的安全性和稳定性。通过本文的介绍,我们了解了Unsafe的基本概念、工作原理以及它的各种应用场景。希望大家在使用Unsafe时能够做到谨慎使用,避免滥用,从而充分发挥其优势,同时规避潜在的风险。

专注Java和MySQL领域知识分享 1244

SCADA|KingSCADA通过组合框选择修改变量的值

《SCADA项目中组合框控件的使用方法》 本文详细介绍了SCADA系统中组合框(下拉框)控件的应用方法。通过具体示例演示如何实现:当选择"雷工笔记"时变量值为100,选择"雷工杂谈"时为200,选择"小李食代"时为300的功能。主要实现步骤包括:1)创建项目并添加组合框控件;2)设置Items选项及对应数值;3)创建内存变量;4)使用GetCurrentIndex()和GetItemData()方法;5)在选项变化事件中编写脚本。该控件在SCADA

做有价值的事,积累有价值的笔记! 867

Unsafe类

Unsafe类

蔡林浩的博客 1122

JavaSwing_4.2: JDialog、JOptionPane(对话框)

JDialog,对话框。使用 JDialog 类可以创建自定义有的对话框,或者调用 JOptionPane 中的多个静态方法快速创建各种标准的对话框。JOptionPane是 JavaSwing 内部已实现好的,以静态方法的形式提供调用,能够快速方便的弹出要求用户提供值或向其发出通知的标准对话框。

谢TS的博客 7万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java Unsafe类 学习

1 Unsafe类介绍 JDK 的 rt.jar 包中的 sum.msic.Unsafe 类提供了硬件级别的原子性操作,Unsafe 类中的方法都是native 方法,它们使用 JNI 的方式访问本地C++ 实现库。 Unsafe类不属于Java标准,但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka等。 使用Uns...

猎人在吃肉 995

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Java Unsafe类

是 JVM 自带的引导类加载器,负责加载核心 Java 类库,无法直接通过 Java 代码访问或操作它。它处于整个类加载器层次结构的顶层,通过双亲委派机制确保了 Java 核心类库的安全和稳定性。

qq_53395217的博客 1290

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

如何在Java中使用Unsafe类或者ByteBuffer实现直接内存访问?

方式安全性性能跨平台适用场景ByteBuffer高中高是I/O 操作、数据传输JNA中(需手动管理)高部分简单本地库调用JNI低(易崩溃)极高否复杂 C/C++ 交互高高是JDK 14+ 结构化内存操作Netty高高是网络编程、高性能场景建议:优先使用ByteBuffer或(JDK 14+),仅在必要时使用 JNI 或 JNA,避免直接使用Unsafe。

1183

Java基础(九)Unsafe类

获取成员变量在内存中的偏移量:objectFieldOffset(Field);获取静态变量在内存中的偏移量:staicFieldOffset(Field);设定指定内存处的值:putInt(obj, address, val);参数1:要操作的对象。如果是直接操作内存地址,这个参数可以为 null。参数2:相对于参数1的内存偏移量,偏移量从参数1在内存中的起始位置开始。如果参数1为null,则此偏移量为绝对地址。参数3:要设置的值。

qq_44818304的博客 1603

深入剖析基于Unsafe的CAS操作:从Java代码到CPU指令

我们揭开了CAS操作从Java代码到CPU指令的神秘面纱。理解这些底层机制,有助于我们写出更高效、更可靠的并发程序。尽管直接使用Unsafe存在风险,但通过标准库的原子类,我们完全可以安全地享受CAS带来的性能优势。

weixin_51786043的博客 929

简单聊一聊Java中的Unsafe类

简单聊一聊Java中的Unsafe类 在阅读AtomicInteger的源码时,看到了这个类:sum.msic.Unsafe,之前从没见过。所以花了点时间研究了下,下面这篇文章主要给大家介绍了关于Java中Unsafe类的相关资料。 Unsafe类介绍 Unsafe类是在sun.misc包下,不属于Java标准。如图所示: 但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka等。 使用Unsafe可用来直接访问系统内存资源并进行

R先生专栏 3220

java unsafe 类_一篇看懂Java中的Unsafe类

前言本文主要给大家介绍了关于Java中Unsafe类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧1.Unsafe类介绍Unsafe类是在sun.misc包下,不属于Java标准。但是很多Java的基础类库,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka等。使用Unsafe可用来直接访问系统内存资源并进行自主管理,...

weixin_39657125的博客 266

Unsafe类详解

Unsafe类、CAS

CodePanda@GPF的博客 2150

Java中Unsafe类的原理详解与使用案例

分享一份自己整理好的Java面试手册,还有一些面试题pdf。

youpccc的博客 1188
上一篇: 【工业物联网首选架构】:KubeEdge边云数据同步性能提升10倍的秘密
下一篇: 【稀缺资源曝光】:Oracle官方未公开的Java模块API文档编写规范
codetrick
博客等级 码龄17年 151粉丝 1991原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值