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);
     }
相关推荐
light blue bird5 小时前
工序路径工站物料 BOM 协同组件
jvm
MATLAB代码顾问5 小时前
Python实现蜂群算法优化TSP问题
开发语言·python·算法
jinanwuhuaguo5 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup6 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952366 小时前
SpringBoot统一功能处理
java·spring boot·后端
有一个好名字6 小时前
工具即双手 —— 从 Bash 到 Tool Dispatch Map
开发语言·chrome·bash
Lyyaoo.6 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19436 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12216 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px6 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋