浅谈LockSupport工具类
引
Java的并发包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS框架需要借助于两个工具类:
- Unsafe(提供CAS操作)
- LockSupport(提供park/unpark操作)
LockSupport的使用
LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread thread)方法来唤醒一个被阻塞的线程。
在Java6中,LockSupport增加了三个带有blocker的方法。参数blocker用来指出当前线程在等待的对象,即阻塞对象,该对象主要用于问题排查和系统监控。
public static void park(Object blocker); // 暂停当前线程
public static void parkNanos(Object blocker, long nanos); // 暂停当前线程,不过有超时时间的限制
public static void parkUntil(Object blocker, long deadline); // 暂停当前线程,直到某个时间
现在通过具体代码看看是如何使用的
LockSupport的原理(以park和unpark为例说明)
1. 源码分析
归根结底,LockSupport.park()和LockSupport.unpark(Thread thread)调用的是Unsafe类中的native代码:
//LockSupport中
public static void park() {UNSAFE.park(false, 0L);}public static void unpark(Thread thread) {if (thread != null)UNSAFE.unpark(thread);}
Unsafe类中的对应方法:
//park
public native void park(boolean isAbsolute, long time);//unpack
public native void unpark(Object var1);
Unsafe.park()和Unsafe.unpark()的底层,在Linux系统下,是用的POSIX的线程库pthread中的mutex(互斥量),condition(条件变量)来实现的,即互斥锁+条件变量。mutex和condition保护了一个_counter的变量,当park时,这个变量被设置为0,当unpark时,这个变量被设置为1。
2. 特性和思想
2.1 许可
LockSupport类使用了一种名为permit(许可)的概念来做到阻塞和唤醒线程的功能,可以把许可看成是一种(0,1)信号量,但这个许可的累加上限是1。初始时,permit为0,当调用unpark()方法时,线程的permit加1,当调用park()方法时,如果permit为0,则调用线程进入阻塞状态。也就是说,park/unpark的设计原理核心是“许可”:park是等待一个许可,unpark是为某线程提供一个许可。如果某线程A调用park,那么除非另外一个线程调用unpark(A)给A一个许可,否则线程A将阻塞在park操作上。
但是这个“许可”是不能叠加的,“许可”是一次性的。比如线程B连续调用了三次unpark函数,当线程A调用park函数就使用掉这个“许可”,如果线程A再次调用park,则进入等待状态。
2.2 顺序
park和unpark的先后顺序并不是那么严格,即unpark操作可以再park操作之前。这时候规则是这样的:
- unpark调用时,如果当前线程还未进入park,则许可为true
- park调用时,判断许可是否为true,如果是true,则继续往下执行;如果是false,则等待,直到许可为true
LockSupport和wait/notify的区别
- LockSupport以线程为操作对象更符合阻塞线程的直观定义。
- 操作更精准,可以准确地唤醒某一个线程,增加了灵活性。而notify随机唤醒一个线程,notifyAll唤醒所有等待的线程。
- wait和notify都是Object中的方法,在调用这两个方法前必须先获得对象的锁,但是park不需要获取某个对象的锁就可以锁住线程。
参考资料
LockSupport详解
LockSupport的用法及原理
Java多线程进阶(五)—— J.U.C之locks框架:LockSupport
浅谈LockSupport工具类相关推荐
- 浅谈ipad阅读类应用设计
自古以来,人们从阅读中了解最新资讯,学习知识,陶冶情操.随着社会和科技的发展,新的阅读设备,阅读方式,丰富的多媒体展示,让阅读这一人类行为更加高效化和多样化.对于平板电脑这个较新的媒介,我们如何能进一 ...
- 深入学习Lock锁(2)——LockSupport工具类
2019独角兽企业重金招聘Python工程师标准>>> 在同步组件中,当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应 工作.LockSupport定义 ...
- 计算机方面的文献在哪里找,最新浅谈计算机参考文献 浅谈计算机专著类参考文献哪里找...
[100个]关于最新浅谈计算机参考文献汇总,作为大学生的毕业生应该明白了浅谈计算机专著类参考文献哪里找,收集好参考文献后的浅谈计算机论文写作起来会更轻松! 一.浅谈计算机论文参考文献范文 [1]浅谈计 ...
- python新式类和旧式类的区别_浅谈python新式类和旧式类区别
python的新式类是2.2版本引进来的,我们可以将之前的类叫做经典类或者旧式类. 为什么要在2.2中引进new style class呢?官方给的解释是: 为了统一类(class)和类型(type) ...
- MYSQL优化浅谈,工具及优化点介绍,mysqldumpslow,pt-query-digest,explain等
MYSQL优化浅谈 msyql是开发常用的关系型数据库,快速.稳定.开源等优点就不说了. 个人认为,项目上线,标志着一个项目真正的开始.从运维,到反馈,到再分析,再版本迭代,再优化- 这是一个漫长且考 ...
- java中的locksupport_java中线程的停止以及LockSupport工具类
看jstack输出的时候,可以发现很多状态都是TIMED_WAITING(parking),如下所示: "http-bio-8080-exec-16" #70 daemon pri ...
- 浅谈 make 工具
在 Linux 环境下编程,make 工具的使用以及编写 Makefile 文件是很重要的.当然,make 工具对在 Windows 环境下编程的程序员也是有用的. Makefile 文件描述了整个工 ...
- 浅谈DevSecOps工具链中的源代码安全保障
近期,很多企业开始关注DevSecOps,下面根据作者对其理解,简单分析一下在DevSecOps的源代码安全该如何考虑和建设. 主要分5部分: 1.DevSecOps建设的背景和目的 2.安全才是提升 ...
- 浅谈互联网社交类产品更迭
现在互联网产品的更迭速度是越来越快了,结合自身多年的使用经历,简单谈谈社交类产品的发展. QQ 国内社交类产品的鼻祖当然是腾讯了,QQ是其成就霸业的重要产品. 在初中拥有了自己的QQ号,但是很少有机会 ...
- 浅谈淘宝类目属性体系:商品搜索背后的逻辑架构
转载自:http://www.geekpark.net/news/205894 摘要 淘宝拥有百万家商户和超过10亿的商品数,它如何让用户精准地找到想要的商品呢?其背后有着强大的技术支撑. 淘宝目前在 ...
最新文章
- java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)
- /proc/sys/vm/ 内存参数
- IPM: Partner determination in Acquisition contract containing IP Product
- grads 相关系数_教程合集 | Grads数据处理基础
- SQL Server CONVERT() 日期转换为新数据类型的 通用函数
- GitHub的10,000个最受欢迎的Java项目-以下是它们使用的顶级库
- logistic模型原理与推导过程分析(2)
- 三维数组设置索引_python3三维数据结构 —— panel
- Q143:FS,物质导数(Material Derivative)
- 张同学会是男版李子柒吗?
- 服务器闪黄灯硬盘可以修复吗,ibmx3850x5服务器故障|硬盘亮黄灯更换处理过程
- BigGAN高保真自然图像合成的大规模GAN训练
- python爬取新浪博客_python爬取韩寒博客的实例
- windows 安全删除硬件并弹出媒体 选项灰色、无法弹出
- 假设有一个英文文本文件,编写一个程序读取其内容并将里面的大写字母变成小写字母,小写字母变成大写字母
- gwipr70驱动天空_win7 kmplayer plus设置_gwi pr2 pluswin7驱动_kmplayerplus官方下载
- 一文详解什么是代理模式
- 腾达路由器显示远程服务器无响应,腾达路由器设置及可能出现的问题
- 程序猿推送利器:使用Python+Server酱打造微信通知推送利器
- HTML制作一个介绍自己家乡的网站——贵阳,排版整洁,内容丰富,主题鲜明