别告诉我你只知道waitnotify,不知道parkunpark???

news2025/1/18 7:29:25

目录

park&unpark

wait,notify 和 park,unpark的区别

park unpark 原理

先调用park的情况

先调用park,在调用unpark的情况

先调用unpark,在调用park的情况


park&unpark

park和unpark都是LockSupport的方法,park用于暂停当前线程的运行,而unpark用于恢复该线程的运行.

我们看一下代码,来看看park和unpark怎么用?

@Slf4j(topic = "c.TestParkUnPark")
public class TestParkUnPark {
    public static void main(String[] args) throws InterruptedException {
        /**
         * 我们这个unpark既可以在park之前调用,也可以在park之后调用
         * 用来恢复暂停线程的运行
         */
        Thread t1 = new Thread(() -> {
            log.debug("开始");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("park");
            LockSupport.park();//暂停当前线程
            log.debug("resume...");
        },"t1");
        t1.start();
        Thread.sleep(1000);
        log.debug("unPark");
        LockSupport.unpark(t1);//恢复t1线程的运行
    }
}

先调用park,在调用unpark

先调用unpark在调用park

从这里我们就可以发现与wait和notify不同的一点,就是unpark在park之前调用还是在park之后调用都能唤醒该线程,而在使用wait和notify的时候,先调用notify,后调用wait,那么不会唤醒waitSet中的线程,应为已经错过通知的时间了,不会唤醒.

这里我总结一下wait,notify 和 park,unpark的区别

wait,notify 和 park,unpark的区别

  • wait,notify是Object的方法,而park,unpark是LockSupport的方法
  • wait,notify必须北河 Object Monitor一起使用,而park,unpark不需要
  • park&unpark是以线程为单位来[阻塞]和[唤醒]线程的,而notify只能随机唤醒一个等待线程,notifyAll是唤醒所有等待线程,不那么精确.
  • park &unpark 可以先调用unpark,而wait,notify不能先notify.

park unpark 原理

每一个线程都有一个parker对象,由三部分组成_counter(标志位),_condition(等待队列),_mutex(对象里面有等待队列)

我们可以打一个比喻.我们把线程当做一个旅游的人,Parker就像他随身携带的背包,条件变量就相当于背包中的帐篷,_counter就相当于背包中的备用干粮

  • 调用park 就是要看当前的旅人要不要停下来去休息
    • 如果备用干粮充足(counter为1)那么就不需要停留,继续前进
    • 如果备用干粮耗尽(counter为0)那么就需要去condition帐篷(等待队列)休息
  • 调用unpark,就相当于让干粮(counter重置为1)充足
    • 如果这时旅人还在帐篷中(等待队列condition),那么就唤醒他继续前进
    • 如果这时旅人还在前进,当下次调用park的时候,不休息,仅仅消耗干粮(counter'重置0),不需停留继续前进.
      • 背包容量有效,多次调用unpark只会补充一份备用干粮

先调用park的情况

先调用park,在调用unpark的情况

先调用unpark,在调用park的情况

总结一下 :

  • 如果调用的是park,先会去检查counter
    • 如果counter为0,那么该线程获得互斥锁mutex,去mutex锁对象中的队列_cond中阻塞等待,再将counter置为0
    • 如果counter为1,那么线程无需阻塞,线程继续运行,然后将counter置为0
  • 如果调用的是unpark
    • 如果counter为0,就会将counter置为1,然后唤醒在等待队列中阻塞的线程
    • 如果此时线程还在继续运行,当下次在调用park的时候,检查counter为1,无需停留,继续运行,然后将counter置为0

另外注意 ,counter只有两种状态0,1多次调用unpark还是为状态还是为1

参考 : 黑马程序员 Java并发编程

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

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

相关文章

服务机器人“众生相”

在多种因素的共同作用下,早年间经常出现在科幻片中的机器人已然穿越荧屏来到了现实世界,为人们的日常生活增添了几分便利。比如,在家庭场景中,扫地机器人帮助人们解放双手;在餐饮场景中,送餐机器人为顾客提…

C语言--探索函数栈帧的创建与销毁

目录 为main函数开辟栈帧 创建变量 传参 为自定义函数开辟栈帧 返回 局部变量是怎么创建的?为什么局部变量的值是随机值?函数是怎么传参的?形参与实参的关系?函数怎么调用与返回? 我们用VS2013的环境进行探索…

Https为什么比Http安全?

Https是在Http之上做了一层加密和认证; 主要的区别是Https在TLS层对常规的Http请求和响应进行加密,同时对这些请求和响应进行数字签名。 Http请求的样式: 明文传输,通过抓包工具可以抓到 GET /hello.txt HTTP/1.1 User-Agent: c…

【三】Netty 解决粘包和拆包问题

netty 解决粘包和拆包问题TCP 粘包/拆包的基础知识粘包和拆包的问题说明TCP粘包/拆包 原因粘包和拆包的解决策略tcp 粘包/拆包 的问题案例大致流程如图:代码展示(jdk1.7)TimeServer 服务端启动类TimeServerHandler 服务端业务处理类TimeClient 客户端启动类TimeClientHandler 客…

Python入门注释和变量(2)

1.1输入 a input("请输入内容") print("您输入的内容是:{}".format(a)) 输入的内容会帮我们转换成字符串形式 2.1运算符 2.1.1算数运算符 以a 10 , b 20 为例进行运算 运算符描述实例加两个对象相加ab输出结果30-减得到负数或是一个数减…

You辉编程_有关boot

一、SpringBoot多环境配置 1.环境的配置信息 (1)application.properties #指定默认使用dev的配置 spring.profiles.activedev (2)application-dev.properties #开发环境 server.port8080 branchdev (3)application-prod.properties #测试环境 server.port8081 branchtest2…

【Nacos】Nacos介绍和简单使用

Nacos介绍及简单使用 Nacos介绍 Nacos是SpringCloudAlibaba架构中最重要的组件。Nacos是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供了注册中心、配置中心和动态DNS服务三大功能。能够无缝对接SpringCloud、Spring、Dubbo等流行框架。 …

环境搭建 | MuMu模拟器 - Window10/11 系列

🖥️ 环境搭建 专栏:MuMu模拟器 - Window10/11 系列 🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 ✨ 个人主页:CoderHing的个人主页 🍀 格言: ☀️ 路漫漫其修远兮,吾将上下而求索☀️ …

FLV格式分析

1.FLV封装格式简介 FLV(Flash Video)是Adobe公司推出的⼀种流媒体格式,由于其封装后的⾳视频⽂件体积小、封装简单等特点,⾮常适合于互联⽹上使⽤。⽬前主流的视频⽹站基本都⽀持FLV。采⽤ FLV格式封装的⽂件后缀为.flv。 2.FLV封装格式分析 FLV封装格…

视频监视计划和设计软件丨IP Video System Design Tool功能简介

本软件提供快速轻松地设计现代视频监视系统之新方式 产品功能 • 降低寻找更好的视频摄像机位置的成本时,增加您的安全系统效能。 • 极短时间内,即可计算出精确的摄像机镜头焦距长度与视角。 • 使用2D和3D建模,检查每台摄像机的视野并寻…

新应用——合同管理应用,实现合同无纸化管理

合同管理应用,是建立在低代码技术基础上,结合企业的管理方式,为企业提供决策、计划、控制与经营绩效评估的全方位、系统化的合同管理解决方案。百数合同管理系统应用提供了从合同模板、合同签订、合同收付款和合同发票管理、合同归档&#xf…

我是如何两个月通过软件设计师的!

软设刚过,分享下经验 个人感觉不是很难,我都不好意思说我没怎么复习,本来以后自己要二战了,没想到,成绩还挺惊喜,大概是因为最后几天冲刺到点子上了。 攻略: 搜集资料,搜集考试相…

一、Kubernetes介绍

文章目录1.常见容器编排工具2.kubernetes简介3.kubernetes组件4.kubernetes概念1.常见容器编排工具 Swarm:Docker自己的容器编排工具Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用Kubernetes:Google开源的的容器…

vector的实现和使用中的常见错误

文章目录实现构造函数时的调用模糊实现insert函数时的迭代器失效使用erase函数时的迭代器失效实现reserve函数使用memcpy函数导致的浅拷贝实现构造函数时的调用模糊 vector的构造函数有这四种,其中有两种在实例化的时候会有调用模糊的问题&#xff1a; vector<int> v(10…

SpringBoot自定义配置的提示

文章目录1. 引入依赖2. 开启 IDEA 配置3. 使用 ConfigurationProperties 自定义配置4. 编译项目&#xff0c;自动生成 spring-configuration-metadata.json 文件文件中的属性值介绍5. 可以看到有提示了官方文档&#xff1a;https://docs.spring.io/spring-boot/docs/2.2.2.RELE…

机器视觉(七):图像分割

目录&#xff1a; 机器视觉&#xff08;一&#xff09;&#xff1a;概述 机器视觉&#xff08;二&#xff09;&#xff1a;机器视觉硬件技术 机器视觉&#xff08;三&#xff09;&#xff1a;摄像机标定技术 机器视觉&#xff08;四&#xff09;&#xff1a;空域图像增强 …

whistle的使用【前端抓包】

前言 抓包工具看起来只是测试要用的东西&#xff0c;其实对前端作用也很多&#xff0c;因为我们也要模拟请求、mock数据、调试。站在巨人肩膀上永远不亏! whistle能解决的痛点 一、看请求不方便 跳页、支付时候上一页的请求结果看不到&#xff0c;h5、小程序newWork不能在电…

Raki的读paper小记:Continual Learning of Natural Language Processing Tasks: A Survey

第一次写综述的小记&#xff0c;也将是我读完的第一篇综述&#xff08; 最开始因为可乐老师的原因&#xff0c;接触到了持续学习&#xff0c;然后从一开始的音频到自己读了一些ICLR的paper找idea做NLP的持续学习&#xff0c;然后做了自己第一个粗糙的工作&#xff0c;在杰哥的…

Hadoop高手之路9-Azkaban工作流管理器

文章目录Hadoop高手之路9-Azkaban工作流管理器一、工作流概述1. 工作流简介2. 常见的工作流调度工具1) Azkaban2) Oozie二、Azkaban简介1. Azkaban组成结构2. Azkaban的部署模式1) solo-server mode&#xff08;独立服务器模式&#xff09;2) two server mode&#xff08;双服务…

8Manage SRM:使用采购管理软件进入现代化模式

在企业运营发展中&#xff0c;采购组织一直是一个非常重要的部门&#xff0c;它会直接影响企业的采购成本效益。在采购活动中&#xff0c;如果采用传统线下的采购方式&#xff0c;容易导致采购信息不集中&#xff0c;效率低&#xff0c;出错率高&#xff0c;最终损害企业的利益…