Java中Unsafe类简介说明
下文笔者讲述Unsafe类的简介说明,如下所示
Unsafe类简介
Unsafe是JVM虚拟机对外开放的一些直接操作内存及线程操作类 Unsafe类属于sun.misc.Unsafe包下 Unsafe类包含: 内存管理,非常规对象实例化 操作类,对象,变量 数组操作 多线程同步(锁机制,CAS操作等) 挂起与恢复
内存管理,如:分配内存、释放内存
Unsafe中包含以下方法可进行内存操作: allocateMemory(分配内存) reallocateMemory(重新分配内存) copyMemory(拷贝内存) freeMemory(释放内存 ) getAddress(获取内存地址) addressSize、pageSize、getInt(获取内存地址指向的整数) getIntVolatile(获取内存地址指向的整数,并支持volatile语义) putInt(将整数写入指定内存地址) putIntVolatile(将整数写入指定内存地址,并支持volatile语义) putOrderedInt(将整数写入指定内存地址、有序或者有延迟的方法)等方法 使用copyMemory方法 可实现一个通用的对象拷贝方法 无需再对每一个对象都实现clone方法 此方法只能实现对象浅拷贝
非常规的对象实例化
allocateInstance()方法: 可创建实例 此方法创建实例,无需使用构造方法 此方法也可设置和修改final字段值
操作类、对象、变量
staticFieldOffset(静态域偏移) defineClass(定义类) defineAnonymousClass(定义匿名类) ensureClassInitialized(确保类初始化) objectFieldOffset(对象域偏移)等方法
数组操作
arrayBaseOffset(获取数组第一个元素的偏移地址) arrayIndexScale(获取数组中元素的增量地址)等方法 注意事项: 1.arrayBaseOffset与arrayIndexScale一起使用 可定位数组中每个元素在内存中的位置 2.Java的数组最大值为Integer.MAX_VALUE 但使用Unsafe类的内存分配方法可以实现超大数组
多线程同步(锁机制、CAS操作)
monitorEnter、tryMonitorEnter、monitorExit、compareAndSwapInt、compareAndSwap等方法。 Unsafe类中CAS操作是我们最常用的方法,它是AQS中的重点内容 如: AtomicInteger等类都是通过该方法来实现 由于compareAndSwap方法是原子方法 可避免繁重的锁机制 提高代码效率
挂起与恢复
park、unpark等方法。 将一个线程进行挂起是通过park方法实现 调用park后 线程将一直阻塞直到超时或中断等条件出现 unpark可以终止一个挂起的线程 使其恢复正常 整个并发框架中对线程的挂起操作被封装在LockSupport类中 LockSupport类中有各种版本pack方法 其最终都是调用Unsafe.park()方法
内存屏障
loadFence、storeFence、fullFence 这些方法是Java8中的新方法,使用此方法,可避免代码重排序 loadFence(): 该方法之前的所有load操作在内存屏障之前完成 storeFence(): 该方法之前的所有store操作在内存屏障之前完成 fullFence(): 该方法之前的所有load、store操作在内存屏障之前完成
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。