多线程之深入理解park与unpark
1.背景
面试官问,如何暂停一个线程勒.....
说说你对park的理解.......
2.代码
package com.ldp.demo01; import com.common.MyThreadUtil;
import lombok.extern.slf4j.Slf4j; import java.util.concurrent.locks.LockSupport; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 02/01 10:58
* @description <p>
* park & unpark 与 wait & notify 相比
* 1.wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必
* 2.park & unpark 是以线程为单位来 阻塞 和 唤醒 线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么 精确
* 3.park & unpark 可以先 unpark,而 wait & notify 不能先 notify
* </p>
*/
@Slf4j
public class Test04UnPark {
/**
* 1.先park在unPark
* 2.先unPark 在park---(会导致第一次park无效)
* <p>
* park的理解(非常重要)
* <p>
* 每个线程都有自己的一个 Parker 对象,
* 由三部分组成 _counter(计数器) , _cond (聚光器,这里相当于休息室) 和 _mutex (互斥量)
* <p>
* 直接解释就是:
* 每个线程都有自己的一个 Parker 对象,
* 由三部分组成 _counter(计数器) , _cond (聚光器,这里相当于休息室) 和 _mutex (互斥量)
* <p>
* <p>
* 当调用 park想暂停线程时
* 如果在这之前没有调用unpark,就直接暂停当前线程.
* 如果在这之前调用了unpark,线程继续运行,相当于这个park无效.
* <p>
* <p>
* 当调用 unpark想让线程继续运行时
* 如果线程是处于暂停状态,线程被唤醒开始执行;
* 如果线程本来就处于运行状态,线程继续运行,并且会记住这次unpark,线程下次park时无效.
* 多次调用unpark时仅一次unpark有效.
*
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(() -> {
log.info("t1......1");
// 2秒后继续执行
MyThreadUtil.sleep(2);
// 暂停当前线程
LockSupport.park();
log.info("t1......2");
LockSupport.park();
log.info("t1......3");
LockSupport.park();
log.info("t1......4");
}, "t1");
t1.start();
// 2秒后继续执行
// MyThreadUtil.sleep(2);
// 回复运行中的状态
LockSupport.unpark(t1);
log.info("unpark......1");
LockSupport.unpark(t1);
log.info("unpark......2");
}
}
3.区别
park & unpark 与 wait & notify 相比
1.wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必
2.park & unpark 是以线程为单位来 阻塞 和 唤醒 线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么 精确
3.park & unpark 可以先 unpark,而 wait & notify 不能先 notify
4.原理理解
每个线程都有自己的一个 Parker 对象,
由三部分组成 _counter(计数器) , _cond (聚光器,这里相当于休息室) 和 _mutex (互斥量)
4.1.直接解释
每个线程都有自己的一个 Parker 对象,
由三部分组成 _counter(计数器) , _cond (聚光器,这里相当于休息室) 和 _mutex (互斥量)
当调用 park想暂停线程时
如果在这之前没有调用unpark,就直接暂停当前线程.
如果在这之前调用了unpark,线程继续运行,相当于这个park无效.
当调用 unpark想让线程继续运行时
如果线程是处于暂停状态,线程被唤醒开始执行;
如果线程本来就处于运行状态,线程继续运行,并且会记住这次unpark,线程下次park时无效.
多次调用unpark时仅一次unpark有效.
完美
多线程之深入理解park与unpark的更多相关文章
- 温故知新-多线程-深入刨析park、unpark
文章目录 摘要 park.unpark 看一下hotspot实现 参考 你的鼓励也是我创作的动力 Posted by 微博@Yangsc_o 原创文章,版权声明:自由转载-非商用-非衍生-保持署名 | ...
- LockSupport中的park()与unpark()
类注释原文:Basic thread blocking primitives for creating locks and other synchronization classes.意思就是Lock ...
- park和unpark
1 介绍 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport提供的两个主要方法就是park和unpark. park译为&quo ...
- LockSupport的park和unpark
LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语. Java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用Lo ...
- c/c++ 多线程 mutex的理解
多线程 mutex的理解 mutex,我的理解是每个mutex对象都是一个带锁头的门,这个门有两个状态,门开着和门关着,感觉像是废话... 当想查看门的里东西,或者把东西放进门里,或者从门里拿出东西前 ...
- 多线程系列之 java多线程的个人理解(二)
前言:上一篇多线程系列之 java多线程的个人理解(一) 讲到了线程.进程.多线程的基本概念,以及多线程在java中的基本实现方式,本篇主要接着上一篇继续讲述多线程在实际项目中的应用以及遇到的诸多问题 ...
- cpu个数、核数、线程数、Java多线程关系的理解
cpu个数.核数.线程数.Java多线程关系的理解 2017年12月08日 15:35:37 一 cpu个数.核数.线程数的关系 cpu个数:是指物理上,也及硬件上的核心数: 核数:是逻辑上的,简单理 ...
- 我对java多进程多线程的浅显理解
linux内核调度算法--CPU时间片如何分配: http://blog.csdn.net/russell_tao/article/details/7103012(转载) ,通过该文章我们知道了进程 ...
- JVM 源码分析(四):深入理解 park / unpark
前言 Parker 源码调试与分析 park/unpark 原理总结 补充:jstack 命令和 kill 命令 前言 熟悉 Java 并发包的人一定对 LockSupport 的 park/unpa ...
- 多线程锁--怎么理解Condition
在java.util.concurrent包中,有两个很特殊的工具类,Condition和ReentrantLock,使用过的人都知道,ReentrantLock(重入锁)是jdk的concurren ...
随机推荐
- mysql 8.0 客户端
1.mysql 8.0 command line client 2.mysql workbench
- Rust性能分析之测试及火焰图,附(lru,lfu,arc)测试
性能测试,在编写代码后,单元测试及性能测试是重要的验收点,好的性能测试可以让我们提前发现程序中存在的问题. 测试用例 在Rust中,测试通常有两部分,一部分是文档测试,一部分是模块测试. 通常我们在函 ...
- CF1320D Reachable Strings
110和011互相转化,相当于就是0在连续两个1的情况下,移动两个位置 能够发现,0的位置的奇偶不会改变,且很多个0之间的相对位置不会改变 猜想考虑这个答案只跟0的奇偶性有关,下面小证一下:(注意下面 ...
- Tutorial: How to install GNU MCU Eclipse?
Overview For more flexibility and upgradeability, GNU MCU Eclipse is not packed as a all-inclusive s ...
- 3568F-PCIe 5G通信测试手册
- OtterCTF 2018 Forensics
OtterCTF 2018 Forensics 题单来自NSSCTF [OtterCTF 2018]What the password? [OtterCTF 2018]General Info [Ot ...
- PHP转Go系列 | ThinkPHP与Gin框架之API接口签名设计实践
大家好,我是码农先森. 回想起以前用模版渲染数据的岁月,那时都没有 API 接口开发的概念.PHP 服务端和前端 HTML.CSS.JS 代码混合式开发,也不分前端.后端程序员,大家都是全干工程师.随 ...
- VUE商城项目 -权限功能 - 手稿
- 存储系列DAS,SAN,NAS常见网络架构
随着主机.磁盘.网络等技术的发展,对于承载大量数据存储的服务器来说,服务器内置存储空间,或者说内置磁盘往往不足以满足存储需要.因此,在内置存储之外,服务器需要采用外置存储的方式扩展存储空间,今天在这里 ...
- 2024-07-17:用go语言,给定一个整数数组nums, 我们可以重复执行以下操作: 选择数组中的前两个元素并删除它们, 每次操作得到的分数是被删除元素的和。 在保持所有操作的分数相同的前提下,
2024-07-17:用go语言,给定一个整数数组nums, 我们可以重复执行以下操作: 选择数组中的前两个元素并删除它们, 每次操作得到的分数是被删除元素的和. 在保持所有操作的分数相同的前提下, ...