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 对象,由三部分组成 countercondmutex 打个比喻

  • 线程就像一个旅人,Parker 就像他随身携带的背包,条件变量就好比背包中的帐篷。_counter 就好比背包中的备用干粮(0 为耗尽,1 为充足)
  • 调用 park 就是要看需不需要停下来歇息
    • 如果备用干粮耗尽,那么钻进帐篷歇息
    • 如果备用干粮充足,那么不需停留,继续前进
  • 调用 unpark,就好比令干粮充足
    • 如果这时线程还在帐篷,就唤醒让他继续前进
    • 如果这时线程还在运行,那么下次他调用 park 时,仅是消耗掉备用干粮,不需停留继续前进
      • 因为背包空间有限,多次调用 unpark 仅会补充一份备用干粮
  1. 当前线程调用 Unsafe.park() 方法
  2. 检查 _counter ,本情况为 0,这时,获得 _mutex 互斥锁
  3. 线程进入 _cond 条件变量阻塞
  4. 设置 _counter = 0
  5. 调用 Unsafe.unpark(Thread_0) 方法,设置 _counter 为 1
  6. 唤醒 _cond 条件变量中的 Thread_0
  7. Thread_0 恢复运行
  8. 设置 _counter 为 0

java并发编程 笔记八相关推荐

  1. java并发编程笔记_java并发编程笔记(一)——并发编程简介

    java并发编程笔记(一)--简介 线程不安全的类示例 public class CountExample1 { // 请求总数 public static int clientTotal = 500 ...

  2. Java并发编程笔记之 CountDownLatch闭锁的源码分析

    转 自: Java并发编程笔记之 CountDownLatch闭锁的源码分析 ​ JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 C ...

  3. Java并发编程笔记(1)基础知识

    Java并发编程的三个性质 原子性 *在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行. *只有形如x = 10这种不可再分的赋值操作才有 ...

  4. Java并发编程笔记

    编程问题中相当大的一部分都可以通过顺序编程来解决,并发编程是指针对某些问题,并发的执行程序中的多个部分,能充分的利用处理器资源,极大地提高程序执行的速度. 并发的多面性 并发编程的主要原因是,使用并发 ...

  5. java并发编程笔记--Executor相关API整理

    Executor框架是concurrent包提供的用于执行线程任务的框架,它基于生产者-消费者模式实现,将提交任务的线程和执行任务的线程解耦.提交任务的线程视作生产者,执行任务的线程视作消费者.任务的 ...

  6. Java并发编程笔记—摘抄—基础知识

    什么是线程安全 当多个线程访问某个类时,不管运行环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 竞态 ...

  7. java并发编程笔记3-同步容器并发容器闭锁栅栏信号量

    一.同步容器: 1.Vector容器实现了List接口,Vector实际上就是一个数组,和ArrayList类似,但是Vector中的方法都是synchronized方法,即进行了同步措施.保证了线程 ...

  8. Java 并发编程笔记(一)

    Semaphore:该类的主要作用是限制线程并发的数量, 为什么要限制并发的数量? 因为CPU资源有限,如果是多个线程同时运行,CPU要把时间片分配给不同的线程对象, 而且上下切换时特别耗时,最终会导 ...

  9. Java并发编程笔记之ConcurrentLinkedQueue源码探究

    JDK 中基于链表的非阻塞无界队列 ConcurrentLinkedQueue 原理剖析,ConcurrentLinkedQueue 内部是如何使用 CAS 非阻塞算法来保证多线程下入队出队操作的线程 ...

最新文章

  1. 解析C语言中的sizeof
  2. miniconda3 安装numpy_Miniconda“安装”numpy,但Python无法导入
  3. [logstash-input-file]插件使用详解
  4. 开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比
  5. 技术内参 | 数据分析,如何解决精度丢失的问题?
  6. 1712: 最大乘积(贪心/dfs)
  7. 向高手学习--第3列数据是第2列从头到当前行的值之和
  8. 2020计算机考研只考数据结构的学校,【择校必看】十三所计算机专业课只考数据结构的985院校!...
  9. 容器、微服务和互联网架构浅谈
  10. 连接DB2 抛异常SQL Error SQLCODE=-204, SQLSTATE=42704
  11. 【数据库学习】——从零学习SQL语句(含SQL数据类型、SQL语句实例操作)
  12. 韩顺平_JAVA_视频教程_下载(打开迅雷,直接复制链接地址即可下载)
  13. 如何为html代码加密
  14. c语言messagebox多窗口,C语言messagebox用法
  15. 题解第八届蓝桥杯B.等差素数列
  16. 摄像机镜头的计算方法
  17. python数字转英文_GitHub - Ailln/en2an: 快速转化「英文数字」和「阿拉伯数字」
  18. EasyExcel(一)导入excel的分析监听器
  19. Audio in Windows Vista(转载)
  20. Maya2018基础(一)通用设置与建模基础与常用快捷键

热门文章

  1. 推荐系统学习(二)--UserCF与ItemCF推荐算法
  2. 开机后黑屏看不到桌面_开机后黑屏看不到桌面怎么解决
  3. 基于深度学习的新冠疫情数据分析
  4. 贪财好色,做个俗人。
  5. 鄙人从事IT业已经有9年时间,少壮不努力,长大搞IT
  6. 少壮不努力 老大徒伤悲
  7. java 后台开发中model与entity(实体类)的区别
  8. 安装secureCRT和secureFX
  9. 由于找不到VCRUNTIME140_1.dll,xxx解决方法
  10. Jsoup如何获得某元素后面的所有兄弟元素