
java并发学习20:park与unpark
发布日期:2021-05-07 02:04:31
浏览次数:9
分类:技术文章
本文共 865 字,大约阅读时间需要 2 分钟。
1、基本使用
它们是 LockSupport 类中的方法
// 暂停当前线程LockSupport.park();// 恢复某个线程的运行LockSupport.unpark(暂停线程对象)
先 park 再 unpark
2、特点
与 Object 的 wait & notify 相比
- wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必
- park & unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么【精确】
- park & unpark 可以先 unpark,而 wait & notify 不能先 notify
3、原理
每个线程都有自己的一个Parker对象,由三部分组成_counter,_cond和_mutex打个比喻
- 线程就像一个旅人,Parker就像他随身携带代背包,条件变量就好比背包中的帐篷。_counter就好比背包中的备用干粮(0为耗尽,1为充足)
- 调用park就是要看需不需要停下来歇息
- 如果备用干粮耗尽,那么钻进帐篷歇息
- 如果备用干粮充足,那么不需停留,继续停留
- 调用unpark,就好比令干粮充足
- 如果这时线程还在帐篷,就唤醒让他继续前进
- 如果这时线程还在运行,那么下次他调用park时,仅是消耗掉备用干粮,不需停留继续前进
- 因为背包空间有限,多次调用unpark仅会补充一份备用干粮
4、流程例子
1)调用Unsage.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
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月15日 22时34分06秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
理解PendingIntent
2019-03-03
Android SurfaceFlinger4 提交Buffer
2019-03-03
深入理解 ClientLifecycleManager 机制
2019-03-03
android基础知识回顾--ContentProvider简单用法
2019-03-03
压缩解压
2019-03-03
js try{}catch(){}finally{}语句
2019-03-03
R3 PRO 3200G和r7 3700u 哪个好
2019-03-03
入手评测 联想小新Pro14和Air14Plus哪个好?区别对比
2019-03-03
macOS Big Sur系统中如何开启设置触控板三指拖拽功能?
2019-03-03
修复苹果Mac中的快速视频播放错误的方法
2019-03-03
Mac系统投屏到电视机的方法
2019-03-03
【Docker&ARM】ARM架构服务器上docker的安装
2019-03-03
php--自定义错误处理函数的使用方法
2019-03-03
php--异常处理主动抛出异常的使用方法
2019-03-03
php--class static
2019-03-03
php--匿名函数的使用
2019-03-03
php--json_decode
2019-03-03
php--class的工厂模式的示例
2019-03-03