多线程教程(十四)parkUnpark 使用及原理

【Java开发日记】我们来说说 LockSupport 的 park 和 unpark LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现。很多锁的类都是基于LockSupport的park和unpark来实现的,所以了解LockSupport类是非常重要的。如果小假的内容对你有帮助,请评论。创作不易,大家的支持就是我坚持下去的动力! 阅读详情

多线程教程(十四)park/Unpark 使用及原理

一、基本使用

它们是 LockSupport 类中的方法

// 暂停当前线程
LockSupport.park(); 
// 恢复某个线程的运行
LockSupport.unpark(暂停线程对象)

先 park 再 unpark

Thread t1 = new Thread(() -> {
    log.debug("start...");
    sleep(1);
    log.debug("park...");
    LockSupport.park();
    log.debug("resume...");
},"t1");
t1.start();
sleep(2);
log.debug("unpark...");
LockSupport.unpark(t1);

输出

18:42:52.585 c.TestParkUnpark [t1] - start... 
18:42:53.589 c.TestParkUnpark [t1] - park... 
18:42:54.583 c.TestParkUnpark [main] - unpark... 
18:42:54.583 c.TestParkUnpark [t1] - resume...

先 unpark 再 park

Thread t1 = new Thread(() -> {
    log.debug("start...");
    sleep(2);
    log.debug("park...");
    LockSupport.park();
    log.debug("resume...");
}, "t1");
t1.start();
sleep(1);
log.debug("unpark...");
LockSupport.unpark(t1);

输出:

18:43:50.765 c.TestParkUnpark [t1] - start... 
18:43:51.764 c.TestParkUnpark [main] - unpark... 
18:43:52.769 c.TestParkUnpark [t1] - park... 
18:43:52.769 c.TestParkUnpark [t1] - resume...

unpark 无论先后,都会使得park失效

二、特点

与 Object 的 wait & notify 相比

  • wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必

  • park & unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么【精确】

  • park & unpark 可以先 unpark,而 wait & notify 不能先 notify

三、原理

每个线程都有自己的一个 Parker 对象,由三部分组成 _counter , _cond 和 _mutex 打个比喻

  1. 线程就像一个旅人,Parker 就像他随身携带的背包,条件变量就好比背包中的帐篷。_counter 就好比背包中的备用干粮(0 为耗尽,1 为充足)

  2. 调用 park 就是要看需不需要停下来歇息

    如果备用干粮耗尽,那么钻进帐篷歇息

    如果备用干粮充足,那么不需停留,继续前进

  3. 调用 unpark,就好比令干粮充足

    如果这时线程还在帐篷,就唤醒让他继续前进

    如果这时线程还在运行,那么下次他调用 park 时,仅是消耗掉备用干粮,不需停留继续前进

  4. 因为背包空间有限,多次调用 unpark 仅会补充一份备用干粮

在这里插入图片描述

  1. 当前线程调用 Unsafe.park() 方法

  2. 检查 _counter ,本情况为 0,这时,获得 _mutex 互斥锁

  3. 线程进入 _cond 条件变量阻塞

  4. 设置 _counter = 0

_mutex可以看作一个提供锁的对象,具体原理不了解,后面深入了解后可能总结

在这里插入图片描述

  1. 调用 Unsafe.unpark(Thread_0) 方法,设置 _counter 为 1

  2. 唤醒 _cond 条件变量中的 Thread_0

  3. Thread_0 恢复运行

  4. 设置 _counter 为 0

在这里插入图片描述

  1. 调用 Unsafe.unpark(Thread_0) 方法,设置 _counter 为 1

  2. 当前线程调用 Unsafe.park() 方法

  3. 检查 _counter ,本情况为 1,这时线程无需阻塞,继续运行

  4. 设置 _counter 为 0

unsafe 包下的方法不是线程不安全的意思,不要误解

24.park和unpark方法 调用unpark方法,_counter=1,_cond没有阻塞的线程,就结束了。然后调用的park方法,发现unpark=1,此时线程无需阻塞继续运行,然后设置_counter=0。当线程调用unpark的时候,把_counter设置为1,唤醒_cond阻塞队列中的线程,线程就恢复运行,又会把_counter设置为0。,就获得_mutex互斥锁,线程进入_cond条件变量阻塞,然后再设置_counter=0。,unpark先调用,park后执行也可以恢复线程。当线程调用park方法,检查_counter, 阅读详情

相关推荐

从建模到调参:基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程解析

本文详细解析了基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程。从运动学建模入手,对比了基于距离与基于位置偏差的两种控制策略,并重点阐述了高精度轨迹跟踪的控制器设计、Simulink仿真搭建及PID参数整定方法,为移动机器人运动控制提供了完整的仿真实践指南。

weixin_29169505的博客 312

Unsafe中的park和unpark

https://www.jianshu.com/p/15f33406543b

以爱护甲,爱满枫林。 2038

[工具使用]黑暗引擎FOFA

黑暗引擎FOFAFOFA(点我进入)逻辑运算符搜索子域名domain搜索指定内容的host全部域名bodycert搜索选定应用的网站搜索指定开放端口的IP搜索指定协议的IP搜索IP或者网段的信息搜索指定CSS/JS网站常用的一些内容其他 FOFA(点我进入) 官网这样描述:FOFA是白帽汇推出的一款网络空间资产搜索引擎。它能够帮助用户迅速进行网络资产匹配、加快后续工作进程。例如进行漏洞影响范围分析、应用分布统计、应用流行度排名统计等。 简单理解就是,一个本土加强版shodan,知道某产品在互联网的部署情况、

网络安全知识分享 3万+

jdk1.8 Unsafe类 park和unpark方法解析

  park是Unsafe类里的native方法,LockSupport类通过调用Unsafe类的park和unpark提供了几个操作。Unsafe的park方法如下: public native void park(boolean isAbsolute, long time);  第一个参数是是否是绝对时间,第二个参数是等待时间值。如果isAbsolute是true则会实现ms定时。如果i...

a7980718的专栏 2万+

深入解析.Net中SM2与sm-crypto的跨平台加解密实践

本文深入探讨了在.Net平台与前端sm-crypto库之间实现SM2国密算法跨平台加解密的实践方案。针对对接中常见的密钥格式、密文拼接顺序(C1C3C2与C1C2C3)等核心难点,提供了基于BouncyCastle的完整工具类实现、前后端联调示例及问题排查指南,旨在帮助开发者构建安全、兼容的数据加密通道。

weixin_29322855的博客 369

NXP S32K1 SPI驱动实战:从配置到DMA传输的完整流程解析

本文深入解析了NXP S32K1系列MCU的SPI驱动开发全流程。基于S32 Design Studio环境,详细阐述了从引脚配置、LPSPI模块初始化,到实现阻塞、中断及DMA三种传输模式的实战代码与配置要点。文章重点剖析了DMA传输的配置细节与性能优化,旨在帮助开发者构建高效、稳定的嵌入式SPI通信,并提供了SPI Flash驱动的综合案例。

blue42的博客 713

java并发编程 笔记八

Park & Unpark 基本使用 它们是 LockSupport 类中的方法 // 暂停当前线程 LockSupport.park(); // 恢复某个线程的运行 LockSupport.unpark(暂停线程对象) 特点 与 Object 的 wait & notify 相比 wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用...

笨鸟先飞 644

深入浅出PWM:用示波器带你理解占空比与滤波效果

本文通过示波器实测,深入浅出地解析了PWM(脉宽调制)的核心原理。从占空比与平均电压的关系入手,详细演示了RC及有源滤波器如何将数字方波“翻译”为平滑模拟电压,并探讨了PWM-DAC的精度、响应速度等关键设计考量,为硬件调试与电路设计提供了实用的实践指导。

weixin_29292431的博客 345

2024年最新三、线程安全,网络安全入门教程

wait()、notify()、 notifyAll() 方法都是属于Object 对象的方法,需要获取此对象的锁 之后才能够使用wait() 对象调用wait() 方法之后,线程会 Owner中释放锁,然后进入WaitSet中等待唤醒wait( time ) 对象调用带参数的wait()方法之后,线程会 Owner中释放锁,然后进入WaitSet中等待 指定时间,然后如果期间没有被唤醒,指定之间之后就会自动唤醒,然后进入EntryList再次尝试获取锁,竞争锁。

2401_84301853的博客 893

AFSim 2.9中文手册实战指南:从安装到高级功能详解(附B站视频链接)

本文详细介绍了AFSim 2.9的安装配置、基础功能操作和高级功能应用,帮助用户快速掌握这款强大的仿真平台。从系统要求检查到多体动力学仿真,再到性能优化技巧,全面解析AFSim 2.9的使用方法,适合初学者和进阶用户参考。

weixin_30892037的博客 565

科研——ICONIP论文修改和提交

ICONIP说明文档

Blackoutdragon的博客 6646

《JUC并发编程 - 模式篇》保护性暂停模式 | 顺序控制模式 | 生产者消费者模式 | 两阶段终止模式 | Balking模式 | 享元模式

《JUC并发编程 - 模式篇》保护性暂停模式 | 顺序控制模式 | 生产者消费者模式 | 两阶段终止模式 | Balking模式

LXYDSF的博客 1472

【数据分享】2012-2022年全国及各城市POI(兴趣点)数据(超20G)

POI(一般作为Point of Interest的缩写,也有Point of Information的说法),通常称作兴趣点,泛指互联网电子地图中的点类数据,基本包含名称、地址、坐标、类别四个属性;随着互联网电子地图服务与LBS应用的普及,POI无论从概念范畴,还是从信息纵深都有了长足发展,互联网各个风口或火山口都和POI有一定关系,如O2O、电商、社交、互联网金融、共享经济等。

J_Giser的博客 2732

ReentrantLock与AQS

知识简陋,掌握就好 1、自旋 自旋次数控制,是为了尽量在Java级别实现而不调用操作系统的api实现,也就是为了尽量不阻塞线程 2、park unpark 阻塞与唤醒 3、CAS操作 原子操作,安全,用于修改状态值state,AQS的队列头尾指针修改等 4、ReentrantLock高级的回答 如果是单个线程或交替执行,他其实和队列无关--jdk级别解决同步问题 不用初始化队列效...

神韵 300

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

三、线程安全

wait()、notify()、 notifyAll() 方法都是属于Object 对象的方法,需要获取此对象的锁 之后才能够使用wait() 对象调用wait() 方法之后,线程会 Owner中释放锁,然后进入WaitSet中等待唤醒wait( time ) 对象调用带参数的wait()方法之后,线程会 Owner中释放锁,然后进入WaitSet中等待 指定时间,然后如果期间没有被唤醒,指定之间之后就会自动唤醒,然后进入EntryList再次尝试获取锁,竞争锁。

yuigjjhgjh的博客 1554

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java并发编程笔记(三)--管程(五)

8.活跃度 死锁发生的条件 定位死锁的方法 死锁的典型问题–哲学家问题 我们检测下死锁 就比如,我们把随后一个哲学家阿基米德拿筷子的顺序更改,就不会发生死锁。 变成: new Philosopher("阿基米德", c5, c1).start(); 但是这种解锁方法会引起饥饿。使得阿基米德哲学家很难吃饭。 更好的解决办法后面有叙述。。。 活锁 活锁出现在两个线程互相改变对方的结束条件,后谁也无法结束。 避免活锁的方法 在线程执行时,中途给予不同的间隔时间即可。 死锁与活锁的区别 死锁是因为

abaidaye的博客 1135

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

136.【JUC并发编程_02】

JUC并发编程(四)、共享模型之管程1.wait notify(1).小故事_为什么需要wait(2).wait notify 的工作原理(3).API介绍2.wait notify 的正确使用步骤 ⭐(1).sleep 和 wait 的区别(2).步骤1_产生的问题(3).步骤2_wait notify 改进产生问题(4).步骤3_产生叫错人问题 (虚假唤醒)(5).步骤4_改进叫错人问题(6).步骤5_改进全叫醒问题(7).总结 wait notify3.设计模式_同步模式之保护性暂停(1).同步模式

qq_69683957的博客 310

并发线程基础第三篇

obj.wait()让进入到Object监视器的线程到waitSet等待obj.notify()从监视器的waitSet等待的线程挑一个唤醒obj.notifyAll()唤醒全部在Object上waitSet等待的线程obj.wait(Long)让该线程等待一定的时间,到时间自动唤醒示例@Slf4jlog.debug("我是线程一");//让线程在obj上一直等待下去log.debug("我是线程一,我被唤醒了");}).start();

2401_83045332的博客 1273

高并发编程

众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的。然而不论是哪个国家,什么背景的 Java 开发者,都对自己写的并发程序相当自信,但也会在出问题时表现得很诧异甚至一筹莫展。可见,Java 并发编程显然不是一件能速成的能力,基础搭得越好,越全面,在实践中才会有更深刻的理解。 因此,大家不难发现 Java 并发问题一直是...

qq_43621053的博客 325

LockSupport的park和unpark

1 介绍 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport提供的两个主要方法就是park和unpark。 park译为“停车”,官方文档意为:许可。为了方便理解,在这里我们可以理解为阻塞,等待,挂起,而unpark我们理解为唤醒,恢复。 LockSupport同步线程和wait/notify不一样,LockSuppor...

luzhensmart的专栏 890

JAVA并发编程(四)-park-unpark

JAVA并发编程(四)-park-unpark

weixin_36531037的博客 1338

Unsafe 中 park、unpatk的使用

java.util.concurrent.locks 包 中LockSupport.java 中线程挂起也采用Unsafe.park() 将线程挂起 public static void park(Object blocker) { Thread t = Thread.currentThread(); setBlocker(t, blocker); UNSAFE.park(false, 0L); setBlocker(t, nu..

qq_37495340的博客 778

java unsafe park_Java中Unsafe类详解

http://www.cnblogs.com/mickole/articles/3757278.htmlJava不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:1、通过Unsafe类可以分配内存,可以释放内存;类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充...

weixin_36083434的博客 1080

java unsafe park_【Java深入研究】8、Java中Unsafe类详解

java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:1、通过Unsafe类可以分配内存,可以释放内存;类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应。public native long allocateMemo...

weixin_39889214的博客 617

【Java基础-并发编程】-Park&Unpark

1. Park&Unpark基本使用 2. 与Object的wait & notify的比较

weixin_51725434的博客 544

Unsafe的CAS操作及线程park与unpark

unsafe cas及线程的park及unpark操作

优快云_G_Y的博客 825
上一篇: 多线程教程(十三) 设计模式之balking(犹豫模式)
下一篇: 多线程教程(十五)多线程的状态转换
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值