Java中Unsafe类简介说明

戚薇 Java教程 发布时间:2023-04-13 06:26:43 阅读数:8515 1
下文笔者讲述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操作在内存屏障之前完成
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202304/6231.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者