LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。

LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。

因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。

基本用法LockSupport 很类似于二元信号量(只有1个许可证可供使用),如果这个许可还没有被占用,当前线程获取许可并继 续 执行;如果许可已经被占用,当前线 程阻塞,等待获取许可。

运行该代码,可以发现主线程一直处于阻塞状态。因为 许可默认是被占用的 ,调用park()时获取不到许可,所以进入阻塞状态。

如下代码:先释放许可,再获取许可,主线程能够正常终止。LockSupport许可的获取和释放,一般来说是对应的,如果多次unpark,只有一次park也不会出现什么问题,结果是许可处于可用状态。

LockSupport是可不重入 的,如果一个线程连续2次调用 LockSupport .park(),那么该线程一定会一直阻塞下去。

这段代码打印出a和b,不会打印c,因为第二次调用park的时候,线程无法获取许可出现死锁。

下面我们来看下LockSupport对应中断的响应性

最终线程会打印出thread over.true。这说明 线程如果因为调用park而阻塞的话,能够响应中断请求(中断状态被设置成true),但是不会抛出InterruptedException 。

LockSupport函数列表

LockSupport示例对比下面的“示例1”和“示例2”可以更清晰的了解LockSupport的用法。

示例1

示例2

运行结果:

说明:park和wait的区别。wait让线程阻塞前,必须通过synchronized获取同步锁。

java中的locksupport_详解Java多线程编程中LockSupport相关推荐

  1. java runnable 异常_详解Java中多线程异常捕获Runnable的实现

    详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口 ...

  2. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

  3. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  4. Java implement意思_详解JAVA中implement和extends的区别

    详解JAVA中implement和extends的区别 发布于 2020-4-14| 复制链接 摘记: 详解JAVA中implement和extends的区别extends是继承父类,只要那个类不是声 ...

  5. java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法

    Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...

  6. java static 函数_详解java中的static关键字

    Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资 ...

  7. java 引用传递_详解java的值传递、地址传递、引用传递

    详解java的值传递.地址传递.引用传递 一直来觉得对值传递和地址传递了解的很清楚,刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递,看完后感受颇深.下边总结下以便更容易理解. 按照以前 ...

  8. java内部格式_详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则 1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...

  9. java 自动装载_java_详解Java的Spring框架下bean的自动装载方式,Spring容器可以自动装配相互协 - phpStudy...

    详解Java的Spring框架下bean的自动装载方式 Spring容器可以自动装配相互协作bean之间的关系,这有助于减少对XML配置,而无需编写一个大的基于Spring应用程序的较多的和元素. 自 ...

最新文章

  1. springmvc常用5种注解_电线电缆工业中常用的5种线缆
  2. 电脑键盘上每个键作用
  3. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(一 .简介与创建自己的代理池)
  4. xs资料网-产品设计图档下载_proe玩具车3D模型图档下载creo4.0汽车模型下载中磊教育...
  5. SxSW小组成员讨论了Valley调查中的Elephant
  6. java web简单线上游戏_有什么在线的编程游戏?
  7. Python数值类型
  8. 惠普打印机驱动下载安装后不能使用,驱动人生解决方案
  9. 《敏捷项目管理》知识要点整理
  10. mysql dump hbase_mysqldump 导出数据库 结构
  11. vue生成随机订单号
  12. Linear Algebra with Sub-linear Zero-Knowledge Arguments学习笔记
  13. Android自动化测试框架uiautomator2详解
  14. 仿QQ概念版的登陆界面
  15. 数字图像学笔记——14. 图像退化与复原(线性退化)
  16. 【181221】VC 编写的网址收藏夹程序(Access)源代码
  17. C语言switch的用法详解
  18. 天宝Trimble Data Transfer安装并传输数据
  19. 内置的lu、bslashtx、lugui函数——Matlab解线性方程组(4)
  20. 微信技术分享:微信的海量IM聊天消息序列号生成实践(容灾方案篇)

热门文章

  1. MySQL免安装版配置教程
  2. 通过过滤器控制页面输出内容
  3. 1107 Social Clusters (30 分)【难度: 中 / 知识点: 并查集】
  4. 【PAT乙级】1039 到底买不买 (20 分)
  5. Windows文件目录DOS窗口
  6. ActiveMQ添加商品接收消息
  7. 【PAT笔记】数学问题——素数和质因数
  8. 推荐一款Java开发的精美个人博客
  9. ViewFlipper的功能和用法
  10. js日期初始化总结:new Date()参数设置