深入java虚拟机:原子操作ParkEvent和Parker

Hotspot Parker和ParkEvent 源码解析 目录 一、LockSupport 1、park 2、unpark 二、Parker 1、定义 2、Allocate /Release 3、park 4、unpark 三、ParkEvent 1、定义 2、Allocate /Release 3、TryPark /park 4、unpark Parker是Unsafe类的park和unpark方法... 阅读详情

基础设施

HotSpot VM并发的基础设施主要是原子操作、ParkEvent和Parker,后面两个功能的重合度很高,未来可能合并为一个ParkEvent。在笔者写这本书的时候(jdk-12+31),它们两个还是独立的个体,所以文中会分别讨论。

 原子操作

原子操作即普通意义上的不可打断的操作。HotSpot VM的原子模块位于runtime/atomic,它实现了原子性的递增值、交换值、比较并交换等操作,其底层实现依赖于CPU指令。举个例子,x86提供lock指令前缀,以保证一个CPU在执行被修饰的指令期间互斥地拥有对应的Cache Line的所有权。这个保证是并发的基础,并发离不开线程,线程离不开锁,如果多个线程在同一时刻抢锁(互斥量/同步量),锁内部就必须有一条只能互斥执行的代码,这便是原子指令。

ParkEvent

使用ParkEvent可以使线程睡眠与唤醒。一个ParkEvent与一个线程的生命周期绑定,当线程结束时,ParkEvent会移到一个EventFreeList链表,而新创建的线程会在EventFreeList中查找ParkEvent,如果没有就分配新的ParkEvent。ParkEvent本身只有分配和释放接口,但是它继承了平台相关的PlaformEvent,因此它就有了PlatformEvent提供的park、unpark接口,如代码清单6-9所示:

代码清单6-9 POSIX PlatformEvent的实现

void os::PlatformEvent::park() {
// CAS递减_event的值
int v;
for (;;) {
v = _event;
if (Atomic::cmpxchg(v - 1, &_event, v) == v) break;
}
if (v == 0) {
int status = pthread_mutex_lock(_mutex);
// 阻塞线程加一
++_nParked;
// 如果递减之后event为-1则阻塞,否则立刻返回
while (_event < 0) {
status = pthread_cond_wait(_cond, _mutex);
}
// 阻塞线程减一
--_nParked;
_event = 0;
status = pthread_mutex_unlock(_mutex);
OrderAccess::fence();
}
}void os::PlatformEvent::unpark() {
// 如果_event大于等于0,则设置为1并返回
if (Atomic::xchg(1, &_event) >= 0) return;
// 仅当_event为-1时,即另一个线程阻塞住时才执行后面的唤醒另一个线程的操作
int status = pthread_mutex_lock(_mutex);
int anyWaiters = _nParked;
status = pthread_mutex_unlock(_mutex);
if (anyWaiters != 0) {
status = pthread_cond_signal(_cond);
}
}

ParkEvent依赖的假设是它只被当前绑定的线程park,但是允许多个线程unpark。了解Windows的读者都知道,Windows内核有可以作为同步工具的Event内核对象。当一个操作完成时,可以将Event对象设置为触发状态,此时等待Event事件的线程将得到通知。ParkEvent在Windows上是通过Event内核对象实现的,由于内核的原生支持,其实现也比POSIX简单不少,如代码清单6-10所示:

代码清单6-10 Windows PlatformEvent的实现

void os::PlatformEvent::park() {
int v;
for (;;) {v = _Event;
if (Atomic::cmpxchg(v-1, &_Event, v) == v) break;
}
if (v != 0) return;
while (_Event < 0) {
DWORD rv = ::WaitForSingleObject(_ParkHandle, INFINITE);
}
_Event = 0;
OrderAccess::fence();
}
void os::PlatformEvent::unpark() {
if (Atomic::xchg(1, &_Event) >= 0) return;
::SetEvent(_ParkHandle);
}

ParkEvent广泛应用于HotSpot VM内部

Eclipse Mar 清空控制台/运行中 闪退 MacOs 配置 Eclipse 版本: Eclipse IDE for Java Developers Version: Mars.2 Release (4.5.2) MacOs High Sierra: Version 10.13.6 (17G65) 发生闪退: 清空控制台(clear console) 运行中,打印大量数据时 解决办法 本来我这样的搭配用了也有好一阵子了,最近... 阅读详情

相关推荐

手把手教你用CMake和MinGW64编译libuvc:静态链接与动态链接的选择

本文详细指导如何在Windows平台上使用CMake和MinGW64编译libuvc库,并深入探讨静态链接与动态链接的选择策略。通过对比两种链接方式在部署复杂度、内存占用和版本管理等方面的差异,帮助开发者根据项目需求做出最优决策,实现高效的USB摄像头开发。

weixin_29171087的博客 255

中国IP发展之面面观

谢学军/邱善勤2006-1-25 9:29:28电子经理世界       IP远没有我们当初想象的那么简单   当SoC设计方法学刚刚传到国内的时候,学界为之欢呼雀跃,由于IP/SoC设计技术的使用,可以将发达国家用几年甚至十几年积累起来的设计技术直接为我所用,使中国的集成电路跳过漫长的积累阶段,迅速站到较高的起点上。因此在当时看来,IP/SoC设计技术是我国提升设计水平、发展

klxdmm305的专栏 1188

别再手动画柜子了!用EPLAN导入STEP模型,5分钟搞定一个标准机柜

本文详细介绍了如何利用EPLAN Pro Panel的3D布局功能,快速将STEP模型转化为智能机柜宏,大幅提升电气工程设计效率。通过实战步骤解析,包括模型导入、智能解析、安装面定义及拼柜技巧,帮助工程师5分钟内完成标准机柜设计,避免传统手动建模的尺寸偏差问题。

weixin_26875109的博客 436

Rstan下载安装攻略

准备把Rtools删掉,重新下载(胡乱猜测是安装顺序的问题),但是卸载时显示Rtools被占用,但我已经把该关的都关了。这一问题的出现,直接让我卸载掉了Rstudio,又重新安装了一个,不过这次安装在另一个磁盘,因为原来的内存不多了。或者参考知乎,使用清华镜像网址进行下载:(知乎链接)https://zhuanlan.zhihu.com/p/346947595(清华下载链接)https://mirrors.tuna.tsinghua.edu.cn/CRAN/bin/windows/Rtools/

m0_64643017的博客 3101

项目管理知识体系(PMBOK)中的质量规划详解

你是否遇到过这些场景?软件上线后用户投诉“功能漏洞多”,团队连夜返工;装修完的房子墙面开裂,施工方和业主互相推诿;新研发的手机电池续航不达标,被迫延迟发布。这些问题的根源,往往是项目启动时没有做好质量规划。本文聚焦PMBOK中“质量规划”(Plan Quality Management)过程,覆盖其核心概念、操作步骤、工具技术与实战应用,适用于IT、建筑、制造等各类项目场景。

项目管理的博客 1121

大学计算 - NumPy库的矩阵运算 实训答案

本文介绍了三个NumPy矩阵操作的实验练习。第一关练习ndarray类型操作,包括矩阵构造、元素平方和计算、矩阵乘积运算和逆矩阵行列式计算;第二关针对matrix类型,涉及绝对值最大值获取、特定矩阵乘积运算和转置矩阵特征值计算;第三关实现Moore-Penrose伪逆矩阵计算,并与NumPy内置pinv函数结果比较误差。实验涵盖了NumPy核心矩阵操作,展示了从基础运算到高级矩阵分解的应用,帮助掌握科学计算中的矩阵处理技巧。

2403_89314916的博客 313

国科大学习资料--高级软件工程-复习题选择题答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题选择题答案 ’‘

无名何许人的博客 1166

Python3实现基于ARIMA模型来预测茅台股票价格趋势

ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。具体来说,ARIMA模型可以通过以下步骤进行建模:数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。

m0_64336780的博客 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 二本菜鸡试水 iQIYI,刷题1000+,成功水过一二三面
下一篇: 还在写大量 if 来判断?试试用一个规则执行器来替代它
奇迹摘星w
博客等级 码龄6年 1844粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值