java并发编程 笔记八
Park & Unpark
基本使用
它们是 LockSupport 类中的方法
// 暂停当前线程
LockSupport.park();
// 恢复某个线程的运行
LockSupport.unpark(暂停线程对象)
特点
与 Object 的 wait & notify 相比
- wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必
- park & unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll是唤醒所有等待线程,就不那么【精确】
- park & unpark 可以先 unpark,而 wait & notify 不能先 notify
park unpark 原理
每个线程都有自己的一个 Parker 对象,由三部分组成 counter
, cond
和 mutex
打个比喻
- 线程就像一个旅人,Parker 就像他随身携带的背包,条件变量就好比背包中的帐篷。_counter 就好比背包中的备用干粮(0 为耗尽,1 为充足)
- 调用 park 就是要看需不需要停下来歇息
- 如果备用干粮耗尽,那么钻进帐篷歇息
- 如果备用干粮充足,那么不需停留,继续前进
- 调用 unpark,就好比令干粮充足
- 如果这时线程还在帐篷,就唤醒让他继续前进
- 如果这时线程还在运行,那么下次他调用 park 时,仅是消耗掉备用干粮,不需停留继续前进
- 因为背包空间有限,多次调用 unpark 仅会补充一份备用干粮
- 因为背包空间有限,多次调用 unpark 仅会补充一份备用干粮
- 当前线程调用 Unsafe.park() 方法
- 检查 _counter ,本情况为 0,这时,获得 _mutex 互斥锁
- 线程进入 _cond 条件变量阻塞
- 设置 _counter = 0
- 调用 Unsafe.unpark(Thread_0) 方法,设置 _counter 为 1
- 唤醒 _cond 条件变量中的 Thread_0
- Thread_0 恢复运行
- 设置 _counter 为 0
java并发编程 笔记八相关推荐
- java并发编程笔记_java并发编程笔记(一)——并发编程简介
java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...
- Java并发编程笔记之 CountDownLatch闭锁的源码分析
转 自: Java并发编程笔记之 CountDownLatch闭锁的源码分析 JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 C ...
- Java并发编程笔记(1)基础知识
Java并发编程的三个性质 原子性 *在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行. *只有形如x = 10这种不可再分的赋值操作才有 ...
- Java并发编程笔记
编程问题中相当大的一部分都可以通过顺序编程来解决,并发编程是指针对某些问题,并发的执行程序中的多个部分,能充分的利用处理器资源,极大地提高程序执行的速度. 并发的多面性 并发编程的主要原因是,使用并发 ...
- java并发编程笔记--Executor相关API整理
Executor框架是concurrent包提供的用于执行线程任务的框架,它基于生产者-消费者模式实现,将提交任务的线程和执行任务的线程解耦.提交任务的线程视作生产者,执行任务的线程视作消费者.任务的 ...
- Java并发编程笔记—摘抄—基础知识
什么是线程安全 当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 竞态 ...
- java并发编程笔记3-同步容器并发容器闭锁栅栏信号量
一.同步容器: 1.Vector容器实现了List接口,Vector实际上就是一个数组,和ArrayList类似,但是Vector中的方法都是synchronized方法,即进行了同步措施.保证了线程 ...
- Java 并发编程笔记(一)
Semaphore:该类的主要作用是限制线程并发的数量, 为什么要限制并发的数量? 因为CPU资源有限,如果是多个线程同时运行,CPU要把时间片分配给不同的线程对象, 而且上下切换时特别耗时,最终会导 ...
- Java并发编程笔记之ConcurrentLinkedQueue源码探究
JDK 中基于链表的非阻塞无界队列 ConcurrentLinkedQueue 原理剖析,ConcurrentLinkedQueue 内部是如何使用 CAS 非阻塞算法来保证多线程下入队出队操作的线程 ...
最新文章
- 解析C语言中的sizeof
- miniconda3 安装numpy_Miniconda“安装”numpy,但Python无法导入
- [logstash-input-file]插件使用详解
- 开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比
- 技术内参 | 数据分析,如何解决精度丢失的问题?
- 1712: 最大乘积(贪心/dfs)
- 向高手学习--第3列数据是第2列从头到当前行的值之和
- 2020计算机考研只考数据结构的学校,【择校必看】十三所计算机专业课只考数据结构的985院校!...
- 容器、微服务和互联网架构浅谈
- 连接DB2 抛异常SQL Error SQLCODE=-204, SQLSTATE=42704
- 【数据库学习】——从零学习SQL语句(含SQL数据类型、SQL语句实例操作)
- 韩顺平_JAVA_视频教程_下载(打开迅雷,直接复制链接地址即可下载)
- 如何为html代码加密
- c语言messagebox多窗口,C语言messagebox用法
- 题解第八届蓝桥杯B.等差素数列
- 摄像机镜头的计算方法
- python数字转英文_GitHub - Ailln/en2an: 快速转化「英文数字」和「阿拉伯数字」
- EasyExcel(一)导入excel的分析监听器
- Audio in Windows Vista(转载)
- Maya2018基础(一)通用设置与建模基础与常用快捷键