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 分钟前
Vue 3 中优雅地集成 Video.js 播放器:从组件封装到功能定制
开发语言·javascript·ecmascript
似水明俊德16 分钟前
02-C#.Net-反射-学习笔记
开发语言·笔记·学习·c#·.net
于先生吖40 分钟前
Java框架开发短剧漫剧系统:后台管理与接口开发
java·开发语言
khddvbe1 小时前
C++并发编程中的死锁避免
开发语言·c++·算法
daidaidaiyu1 小时前
Spring IOC 源码学习 声明式事务的入口点
java·spring
myloveasuka2 小时前
[Java]查找算法&排序算法
java·算法·排序算法
清水白石0082 小时前
Free-Threaded Python 实战指南:机遇、风险与 PoC 验证方案
java·python·算法
wWYy.2 小时前
STL:list
开发语言·c++
TON_G-T2 小时前
day.js和 Moment.js
开发语言·javascript·ecmascript
发际线还在2 小时前
互联网大厂Java三轮面试全流程实战问答与解析
java·数据库·分布式·面试·并发·系统设计·大厂