Park和UnPark底层原理

news2024/12/27 13:02:16

文章目录

    • 1. 简介
    • 2. 底层原理
    • 3. 总结

1. 简介

park和unpark也是一个线程暂停技术(让线程进入wait状态),与wait/notify不同的是,前者是LockSupport类中的方法,后者是Object类中的方法。其次,wait与notify和notifyall必须配合Object Monitor一起使用,而park和unpark不必一起使用。park和unpark是以线程为单位来阻塞和唤醒线程的,而notify只能随机唤醒一个等待线程。最后park和unpark可以先unpark,而wait和notify不行。

2. 底层原理

每个线程都有自己的一个Parker对象(c代码实现),由三个部分组成_counter,_cond, _mutex,打个比喻:

  1. 线程就像一个旅人,Parker就是其携带的背包,条件变量(_cond)就好比背包中的帐篷,_couter就好比备用的干粮
  2. 调用park就是看需不需要停下来休息,如果干粮没有了就进帐篷休息,如果还有干粮就继续前进
  3. 调用unpark就好比令干粮充足,如果现在线程还在帐篷中,就唤醒他继续前进,如果线程还在运行,那么下次它调用park,仅消耗掉备用干粮,继续前进,因为背包容量有限,所以多次调用unpark只会补充一份干粮。

先调用park,再调用unpark:
在这里插入图片描述

  1. 当前线程调用unsafe.park()方法
  2. 检查_counter,本情况为0,这是,获得_mutex互斥锁
  3. 线程进入cond条件变量阻塞
  4. 设置_counter=0

在这里插入图片描述

  1. 调用Unsafe.unpark(Thread 0)方法,设置counter为1
  2. 唤醒_cond条件变量中的Thread_0
  3. Thread 0恢复运行
  4. 设置_countre为0

先调用unpark再调用park:
在这里插入图片描述

  1. 调用Unsafe.unpark(Thread_0)方法,设置_counter为1
  2. 当前线程调用Unsafe.park()方法
  3. 检查_counter,本情况为1,这时现场无需阻塞,继续运行
  4. 设置_counter为0

3. 总结

先调用 park 再调用 unpark:如果先调用 park,那么当前线程将进入阻塞状态,等待被其他线程调用 unpark 方法唤醒。
先调用 unpark 再调用 park:如果先调用 unpark,它将为当前线程创建一个"许可证",以便稍后可以使用。这个许可证不会累积,每个线程最多只能有一个许可证。当稍后调用 park 时,如果已经有一个 “许可证”(通过先调用 unpark 而获得),那么 park 不会阻塞,它会消耗掉许可证,线程继续执行。如果没有可用的许可证,park 将阻塞。

所以,先调用 unpark 再调用 park 通常用于确保某个操作发生之前,线程不会被阻塞,而先调用 park 再调用 unpark 则用于将线程置于阻塞状态,等待特定条件的发生。需要注意的是,unpark 方法可以多次调用,但它只会为一个线程创建一个许可证。如果多次调用 unpark,线程仍然只会有一个许可证,而不会累积多个许可证。这意味着多次调用 unpark 不会使 park 方法重复消耗多个许可证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1186739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Makefile 介绍

目录 一、Makefile 的规则 二、一个示例 三、make 是如何工作的 四、makefile 中使用变量 五、让 make 自动推导 六、另类风格的 makefile 七、清空目标文件的规则 make 命令执行时,需要一个 Makefile 文件,以告诉 make 命令需要怎么样的去编译和…

1.docker linux离线环境安装 20.1.0.12

目录 概述下载解压docker 卸载docker 安装检查安装环境常用命令结束 概述 docker离线环境安装 20.1.0.12 , centos 7.x 下载 安装包下载 解压 [roothadoop01 soft]# unzip docker_20_1_0_12.zip [roothadoop01 soft]# cd docker_20_1_0_12 [roothadoop01 docker_20_1_0_1…

Java系统操作日志之数据修改变化记录

系统操作日志之数据修改变化记录 前言效果图如何实现总结 相信大家在自己的系统中都有记录日志吧,像登录日志、操作日志等等 但是一般来说,大家都是获取操作了什么东西,包括它的参数,模块等等,但是你有关心过他的数据变…

06【保姆级】-GO语言的运算符

之前我学过C、Java、Python语言时总结的经验: 先建立整体框架,然后再去抠细节。先Know how,然后know why。先做出来,然后再去一点点研究,才会事半功倍。适当的囫囵吞枣。因为死抠某个知识点很浪费时间的。对于GO语言&a…

使用MCU上的I2C总线进行传感器应用

使用MCU上的I2C总线进行传感器应用是嵌入式系统开发中常见的任务,本文将介绍在MCU上实现I2C总线传感器应用的相关技术和流程。 首先,I2C(Inter-Integrated Circuit)总线是一种常用的串行通信协议,用于连接多个设备&am…

2023/11/8JAVA学习

多个条件也可以&&放在一块,支持链式编程 map()数据加工,一个对象转化为另一个 不能这样写 不会去重报错

java入门,记一次mysql函数使用

一、前言 记一次mysql函数使用,要求给一个字段进行拼接,然后MD5加密,再转换成大写。这里都是有现成的函数,所以记录下来 二、函数使用 1、拼接函数: concat(字符串1,字符串2) select concat(字符串1,字符串2); 2、…

Postman使用方法详细攻略

一、Postman背景介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的,用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调试工具不仅可以调试简单的css、html、脚本等简单的网…

APISpace IP归属地查询接口案例代码

1.IP归属地查询API 1.1 API接口简介 IP归属地查询API:根据IP地址查询归属地信息,包含国家、省、市、区县和运营商等信息。APISpace 提供了IPv4 和 IPv6 的IP归属地查询接口,并且包含了各种归属地精度查询的接口。 1.2 IPv4 IPv4归属地查询…

数据结构与算法-(11)---有序表(OrderedList)

🌈个人主页: Aileen_0v0 🔥系列专栏:PYTHON学习系列专栏 💫"没有罗马,那就自己创造罗马~" 目录 知识回顾及总结 有序表的引入 ​编辑 实现有序表 1.有序表-类的构造方法 2.有序表-search方法的实现 3.有序表-add方法的实现…

电气元器件的型号,符号,接线认识(一)

目录 按钮开关 类型 文字与图形符号 常开常闭触点 接线图 中间继电器 实物图 文字与图形符号 接线图 交流接触器 实物图 文字与图形符号 接线图 开关电源 图形 文字与图形符号 接线图 断路器 实物图 类型 文字与图形符号 接线图 今天让我们来认识一下电路元…

ci-cd的流程

1、项目在gitlab上,从gitlab上使用git插件获取源码,构建成war包,所以使用tomcat作为运行环境 发布 :使用maven插件发布,使用ssh连接。

大众动力总成构建全程数字化的数电票管理平台

客户简介 上海大众动力总成有限公司成立于2005年4月29日,是德国大众在中国的全资投资公司大众汽车(中国)投资有限公司和上海汽车集团股份有限公司合资组建的发动机生产企业,是世界上加工工艺和技术水平最先进的发动机生产基地之一…

kubernetes集群编排(8)

k8s资源监控 资源限制 上传镜像 [rootk8s2 limit]# vim limit.yaml apiVersion: v1 kind: Pod metadata:name: memory-demo spec:containers:- name: memory-demoimage: stressargs:- --vm- "1"- --vm-bytes- 200Mresources:requests:memory: 50Milimits:memory: 100…

使用EvoMap/Three.js模拟无人机灯光秀

一、创建地图对象 首先我们需要创建一个EM.Map对象,该对象代表了一个地图实例,并设置id为"map"的文档元素作为地图的容器。 let map new EM.Map("map",{zoom:22.14,center:[8.02528, -29.27638, 0],pitch:71.507,roll:2.01,maxPit…

在linux中配置固定ip

1、在虚拟机中配置网络,改ONBOOTyes后默认直接DHCP自动获取ip,但是这种方法会导致ip改变。这个时候,我们需要配置固定ip 2、进入/etc/sysconfig/network-scripts查看ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOdh…

Flink之状态管理

Flink状态管理 状态概述状态分类 键控、按键分区状态概述值状态 ValueState列表状态 ListStateMap状态 MapState归约状态 ReducingState聚合状态 Aggregating State 算子状态概述列表状态 ListState联合列表状态 UnionListState广播状态 Broadcast State 状态有效期 (TTL)概述S…

Kubernetes7大网络插件之Antrea

目录 前言 Antrea简介 Antrea安装使用 下载Antrea YAML文件 编辑YAML文件 应用YAML文件 等待安装完成 配置网络策略 测试 创建命名空间 部署两个Nginx Pod 定义网络策略 测试网络策略 前言 在现代容器化应用程序的世界中,容器编排平台Kubernetes已经成为…

Mybatis-Plus同时使用逻辑删除和唯一索引的问题及解决办法

1 问题背景 在开发中,我们经常会有逻辑删除和唯一索引同时使用的情况。但当使用mybatis plus时,如果同时使用逻辑删除和唯一索引,会报数据重复Duplicate entry的问题。 举例来说,有表user,建立唯一索引(u…

配置Linux为无线路由器

配置Linux无线路由器 将Linux配置为无线路由器。使用hostapd,可以配置无线网卡为AP模式。 这里使用buildroot来生成这个工具。Wi-Fi模块使用的是 rt8188eus。 1. 内核配置 2. buildroot配置 开启 rt8188eus 驱动 3. 启动hostapd 系统启动后,会自动加…