Java查漏补缺

yin_bo_ Lv3

魔法类Unsafe

  • Unsafesun.misc包下的一个类
    它可以绕过JVM安全机制,直接操作内存
    Unsafe = Java里的C语言指针

  • 为什么叫Unsafe
    因为他做的事绕过了JVM,很危险

    • 可以像C语言的指针一样,直接操作堆外内存,手动分配和释放
    • 可以跳过访问控制(private也能改)
  • Unsafe功能使用

    1. 直接操作堆外内存(核心功能)
      操作的内存不受GC管理

    2. CAS(无锁并发)
      unsafe类里有CAS(CompareAndSwap)方法,可以实现无锁并发,
      AtomicIntergerConcurrentHashMap的底层实现
      本质就是CPU指令级别原子操作

    3. 线程调度(park/unpark)
      方法park/unpark可以实现线程的阻塞和恢复
      可以实现ReentrantLockAQS

    4. 修改对象字段(可以绕过private控制)
      unsafe.putInt(obj,offset,0)
      可以修改private字段,不走setter和安全检查

    5. 跳过构造方法实现类加载
      User u= (User)unsafe.allocateInstance(User.class)
      不会执行构造方法,也可以类加载创建实例

  • Unsafe在哪里用到了

    1. JUC并发包
      AtomicInterger -> CAS
      park/unpark -> AQS
      CAS + 直接内存操作 实现了ConcurrentHashMap

    2. Netty
      使用堆外内存提高IO性能

  • 由于它不安全且不是标准 API,JDK9 之后推荐使用 VarHandle 等方式替代。

  • 标题: Java查漏补缺
  • 作者: yin_bo_
  • 创建于 : 2026-04-01 22:26:38
  • 更新于 : 2026-04-06 18:26:15
  • 链接: https://www.blog.yinbo.xyz/2026/04/01/面试题/Java查漏补缺/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
目录
Java查漏补缺