没有合适的资源?快使用搜索试试~ 我知道了~
Java Unsafe类1
资源推荐
资源详情
资源评论
Java Unsafe 类
简单介绍
Unsafe 类使 Java 拥有了像 C 语言的指针一样操作内存空间的能力,同时也带来了
指针的问题。
过度的使用 Unsafe 类会使得出错的几率变大,因此 Java 官方并不建议使用的,官
方文档也几乎没有。
Oracle 正在计划从 Java 9 中去掉 Unsafe 类
主要功能有三个
操纵对象属性
操纵对象属性,主要落在这个方法上:
public native long objectFieldOffset(Field f);
通过此方法,可以获取对象中某个属性的内存偏移地址,然后可根据偏移地址直接
对属性进行修改,属性是否可读都无所谓,都能修改。
Field name = user.getClass().getDeclaredField("name");
long nameOffset = unsafe.objectFieldOffset(name);
unsafe.putObject(user, nameOffset, "jim");
操纵数组元素
操纵数组元素,主要涉及两个接口。
public native int arrayBaseOffset(Class arrayClass);
public native int arrayIndexScale(Class arrayClass);
arrayBaseOffset,获取数组第一个元素的偏移地址。
arrayIndexScale,获取数组中元素的增量地址。
arrayBaseOffset 与 arrayIndexScale 配合起来使用,就可以定位数组中每个元素
在内存中的位置
例如:索引为 i 的元素可以使用如下代码定位:
int baseOffset = unsafe.arrayBaseOffset(array.getClass());
int indexScale = unsafe.arrayIndexScale(array.getClass());
baseOffset + i*indexScale
线程挂起与恢复、CAS
如果我们使用 ReentrantLock 进行多线程开发,当一个线程抢占锁失败时,线程
将被挂起,实现线程挂起的正是 Unsafe 类。
将一个线程进行挂起是通过 park 方法实现的,调用 park 后,线程将一直阻塞直到
超时或者中断等条件出现。unpark 可以终止一个挂起的线程,使其恢复正常。整个并发
框架中对线程的挂起操作被封装在 LockSupport 类中,LockSupport 类中有各种版本
pack 方法,但最终都调用了 Unsafe.park()方法。
CAS,一种乐观锁机制,如果对象当前值和期望值一样,那么则将对象的值设置成
新值。和悲观锁不一样,它不需要抢占锁,它是一种尝试性的,能有效地提高效率,它
的全称是 compareAndSwap ,依赖于硬件的原子操作实现。详细的 CAS 请参考 线程安
全 一文。
资源评论
Orca是只鲸
- 粉丝: 24
- 资源: 317
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- YOLOV4-TINY权重文件
- 以下是一个使用贪心算法解决多机调度问题的基本步骤0.txt
- 基于大数据的房产估价是近年来随着技术的发展而兴起的一种新型估价方法.txt
- 企业供应链管理系统v3.rar
- 富芮坤FR8016HA蓝牙开发板使用手册+硬件PCB图+封装库+DEMO演示软件源代码.zip
- 基于YOLOv7的芯片表面缺陷检测系统
- 京东物流 数字化供应链综合研究报告2018.rar
- 基于YOLOv7的植物虫害识别&防治系统
- 2000.1-2023.8中国经济政策不确定性指数月度数据.xlsx
- Screenshot_2024-04-21-20-42-15-443_com.tencent.mm.jpg
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功