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操作之前。这时候规则是这样的:

  1. unpark调用时,如果当前线程还未进入park,则许可为true
  2. park调用时,判断许可是否为true,如果是true,则继续往下执行;如果是false,则等待,直到许可为true

LockSupport和wait/notify的区别

  • LockSupport以线程为操作对象更符合阻塞线程的直观定义。
  • 操作更精准,可以准确地唤醒某一个线程,增加了灵活性。而notify随机唤醒一个线程,notifyAll唤醒所有等待的线程。
  • wait和notify都是Object中的方法,在调用这两个方法前必须先获得对象的锁,但是park不需要获取某个对象的锁就可以锁住线程。

参考资料

LockSupport详解

LockSupport的用法及原理

Java多线程进阶(五)—— J.U.C之locks框架:LockSupport

浅谈LockSupport工具类相关推荐

  1. 浅谈ipad阅读类应用设计

    自古以来,人们从阅读中了解最新资讯,学习知识,陶冶情操.随着社会和科技的发展,新的阅读设备,阅读方式,丰富的多媒体展示,让阅读这一人类行为更加高效化和多样化.对于平板电脑这个较新的媒介,我们如何能进一 ...

  2. 深入学习Lock锁(2)——LockSupport工具类

    2019独角兽企业重金招聘Python工程师标准>>> 在同步组件中,当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应 工作.LockSupport定义 ...

  3. 计算机方面的文献在哪里找,最新浅谈计算机参考文献 浅谈计算机专著类参考文献哪里找...

    [100个]关于最新浅谈计算机参考文献汇总,作为大学生的毕业生应该明白了浅谈计算机专著类参考文献哪里找,收集好参考文献后的浅谈计算机论文写作起来会更轻松! 一.浅谈计算机论文参考文献范文 [1]浅谈计 ...

  4. python新式类和旧式类的区别_浅谈python新式类和旧式类区别

    python的新式类是2.2版本引进来的,我们可以将之前的类叫做经典类或者旧式类. 为什么要在2.2中引进new style class呢?官方给的解释是: 为了统一类(class)和类型(type) ...

  5. MYSQL优化浅谈,工具及优化点介绍,mysqldumpslow,pt-query-digest,explain等

    MYSQL优化浅谈 msyql是开发常用的关系型数据库,快速.稳定.开源等优点就不说了. 个人认为,项目上线,标志着一个项目真正的开始.从运维,到反馈,到再分析,再版本迭代,再优化- 这是一个漫长且考 ...

  6. java中的locksupport_java中线程的停止以及LockSupport工具类

    看jstack输出的时候,可以发现很多状态都是TIMED_WAITING(parking),如下所示: "http-bio-8080-exec-16" #70 daemon pri ...

  7. 浅谈 make 工具

    在 Linux 环境下编程,make 工具的使用以及编写 Makefile 文件是很重要的.当然,make 工具对在 Windows 环境下编程的程序员也是有用的. Makefile 文件描述了整个工 ...

  8. 浅谈DevSecOps工具链中的源代码安全保障

    近期,很多企业开始关注DevSecOps,下面根据作者对其理解,简单分析一下在DevSecOps的源代码安全该如何考虑和建设. 主要分5部分: 1.DevSecOps建设的背景和目的 2.安全才是提升 ...

  9. 浅谈互联网社交类产品更迭

    现在互联网产品的更迭速度是越来越快了,结合自身多年的使用经历,简单谈谈社交类产品的发展. QQ 国内社交类产品的鼻祖当然是腾讯了,QQ是其成就霸业的重要产品. 在初中拥有了自己的QQ号,但是很少有机会 ...

  10. 浅谈淘宝类目属性体系:商品搜索背后的逻辑架构

    转载自:http://www.geekpark.net/news/205894 摘要 淘宝拥有百万家商户和超过10亿的商品数,它如何让用户精准地找到想要的商品呢?其背后有着强大的技术支撑. 淘宝目前在 ...

最新文章

  1. java unlimited_具有无限参数的Java方法(Java method with unlimited arguments)
  2. /proc/sys/vm/ 内存参数
  3. IPM: Partner determination in Acquisition contract containing IP Product
  4. grads 相关系数_教程合集 | Grads数据处理基础
  5. SQL Server CONVERT() 日期转换为新数据类型的 通用函数
  6. GitHub的10,000个最受欢迎的Java项目-以下是它们使用的顶级库
  7. logistic模型原理与推导过程分析(2)
  8. 三维数组设置索引_python3三维数据结构 —— panel
  9. Q143:FS,物质导数(Material Derivative)
  10. 张同学会是男版李子柒吗?
  11. 服务器闪黄灯硬盘可以修复吗,ibmx3850x5服务器故障|硬盘亮黄灯更换处理过程
  12. BigGAN高保真自然图像合成的大规模GAN训练
  13. python爬取新浪博客_python爬取韩寒博客的实例
  14. windows 安全删除硬件并弹出媒体 选项灰色、无法弹出
  15. 假设有一个英文文本文件,编写一个程序读取其内容并将里面的大写字母变成小写字母,小写字母变成大写字母
  16. gwipr70驱动天空_win7 kmplayer plus设置_gwi pr2 pluswin7驱动_kmplayerplus官方下载
  17. 一文详解什么是代理模式
  18. 腾达路由器显示远程服务器无响应,腾达路由器设置及可能出现的问题
  19. 程序猿推送利器:使用Python+Server酱打造微信通知推送利器
  20. HTML制作一个介绍自己家乡的网站——贵阳,排版整洁,内容丰富,主题鲜明

热门文章

  1. 一个传统的前端框架的布局
  2. photos for mather's day
  3. 采集新浪微博数据建设网络舆情监测系统
  4. 关于通用配置管理模块的思考-续(用XmlDocument 还是DataSet)
  5. 认识并学会springCloud的使用
  6. 接口测试基础——第6篇unittest模块(三)
  7. 解决Eclipse中文乱码的问题
  8. 《信息安全系统设计基础》实验五 简单嵌入式WEB服务器实验
  9. [na]802.1x协议无线认证协议dot1x有线认证实验
  10. 关于在for循环中绑定事件打印变量i是最后一次。