JAVA Unsafe 类介绍

Unsafe 类提供了低级别、不安全的原始操作,这些操作可以直接访问内存。由于这些操作非常强大,可以直接操作内存,因此也非常危险。如果使用不当,可能会导致严重的内存泄露问题。

Unsafe 类的主要功能包括:

  1. 直接内存访问:可以分配和释放内存,创建和操作对象。
复制代码
  private static final int BUFFER_SIZE = 1024;
 
    // 获取Unsafe实例
    private static final Unsafe unsafe = getUnsafeInstance();
 
    // 分配内存
    private static final long buffer = unsafe.allocateMemory(BUFFER_SIZE);
 
    private static Unsafe getUnsafeInstance() {
        try {
            Field field = Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            return (Unsafe) field.get(null);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
 
    public static void main(String[] args) {
        // 使用直接内存
        unsafe.setMemory(buffer, BUFFER_SIZE, (byte) 0);
 
        // ... 进行其他操作
 
        // 释放内存
        unsafe.freeMemory(buffer);
    }
  1. 线程和锁:提供了线程的挂起和恢复、定时等待等操作。

    复制代码
     private static final Unsafe UNSAFE;
     private static final long THREAD_PTR;
    
     static {
         try {
             Field field = Unsafe.class.getDeclaredField("theUnsafe");
             field.setAccessible(true);
             UNSAFE = (Unsafe) field.get(null);
    
             Thread currentThread = Thread.currentThread();
             THREAD_PTR = UNSAFE.getLong(currentThread, UNSAFE.objectFieldOffset(Thread.class.getDeclaredField("threadStatus")));
         } catch (Exception e) {
             throw new Error(e);
         }
     }
    
     public static void parkThread() {
         UNSAFE.park(false, 0L);
     }
    
     public static void unparkThread() {
         UNSAFE.unpark(Thread.currentThread());
     }
    
     public static void main(String[] args) throws InterruptedException {
         Thread thread = new Thread(() -> {
             System.out.println("Thread is going to be parked");
             parkThread();
             System.out.println("Thread is unparked");
         });
    
         thread.start();
         Thread.sleep(1000); // Wait for the thread to start and print the first message
         unparkThread(); // Unpark the thread
     }
  2. 可见性操作:提供了一些方法来保证线程间的可见性。

    复制代码
      private static final Unsafe UNSAFE;
        private static final long VALUE_OFFSET;
     
        static {
            try {
                Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
                theUnsafe.setAccessible(true);
                UNSAFE = (Unsafe) theUnsafe.get(null);
     
                VALUE_OFFSET = UNSAFE.objectFieldOffset(
                    UnsafeVisibilityExample.class.getDeclaredField("value"));
            } catch (Exception e) {
                throw new Error(e);
            }
        }
     
        private volatile int value = 0;
     
        public void increaseValue() {
            UNSAFE.putOrderedInt(this, VALUE_OFFSET, value + 1);
        }
     
        public int getValue() {
            return value;
        }
     
        public static void main(String[] args) throws InterruptedException {
            UnsafeVisibilityExample example = new UnsafeVisibilityExample();
     
            Thread t1 = new Thread(() -> {
                for (int i = 0; i < 10000; i++) {
                    example.increaseValue();
                }
            });
     
            Thread t2 = new Thread(() -> {
                while (example.getValue() < 10000) {
                    // Busy wait until condition is met
                }
            });
     
            t1.start();
            t2.start();
     
            t1.join();
            t2.join();
     
            System.out.println("Value after both threads have finished: " + example.getValue());
        }
  3. CAS 操作:提供了 CompareAndSwap 等原子操作。

    复制代码
     private static final Unsafe UNSAFE;
     private static final long VALUE_OFFSET;
    
     static {
         try {
             Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
             theUnsafe.setAccessible(true);
             UNSAFE = (Unsafe) theUnsafe.get(null);
    
             VALUE_OFFSET = UNSAFE.objectFieldOffset(UnsafeTest.class.getDeclaredField("value"));
         } catch (Exception e) {
             throw new Error(e);
         }
     }
    
     private volatile int value;
    
     public static void main(String[] args) {
         UnsafeTest unsafeTest = new UnsafeTest();
         unsafeTest.value = 10;
    
         System.out.println("Before: " + unsafeTest.value);
    
         boolean success = UNSAFE.compareAndSwapInt(unsafeTest, VALUE_OFFSET, 10, 20);
    
         System.out.println("Success: " + success);
         System.out.println("After: " + unsafeTest.value);
     }
相关推荐
众链网络3 分钟前
Agent 重试的工程解法:幂等、断点续跑与熔断怎么落地
java·前端·数据库·人工智能
贾宝玉的玉宝贾10 分钟前
FreeSWITCH 简单图形化界面 70 - 监听/密语的lua脚本
开发语言·junit·lua·voip·freeswitch·sip·ippbx
Wang's Blog11 分钟前
Java 项目部署之 Docker工具快速入门: 镜像命令从 pull 到 load 的完整实操
java·开发语言·docker
北京盛世宏博16 分钟前
异地机房采集踩坑笔记:以太网温湿度记录仪跨网段通信调试实战
开发语言·笔记·单片机·php·传感器·温湿度
Wang's Blog19 分钟前
Java 项目部署之 Docker工具快速入门: Docker 数据卷命令与挂载实操
java·开发语言·docker
云和数据.ChenGuang27 分钟前
用 Claude Code 重构遗留系统:从评估到落地的完整指南
java·人工智能·spring boot·后端·重构·springai
霸道流氓气质29 分钟前
AI 应用异常检测与根因分析:语义漂移检测、因果图推理与LLM-as-Judge的 Java 生产级实现
java·开发语言·人工智能
棉猴35 分钟前
玩游戏学Python2-IDLE与pgzero入门
开发语言·python·游戏·玩游戏·pgzero·pgzrun
xuxigifxfh38 分钟前
牛客:BISHI2 【模板】栈的操作
java·开发语言·windows·算法
房开民1 小时前
通俗总结 Octree(八叉树)
java·服务器·数据库