1 介绍

LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语。LockSupport提供的两个主要方法就是park和unpark。

park译为“停车”,官方文档意为:许可。为了方便理解,在这里我们可以理解为阻塞,等待,挂起,而unpark我们理解为唤醒,恢复。

LockSupport同步线程和wait/notify不一样,LockSupport并不需要获取对象的监视器,而是给线程一个“许可”(permit)。而permit只能是0个或者1个。unpark会给线程一个permit,而且最多是1;而park会消耗一个permit并返回,如果线程没有permit则会阻塞。

2 特点以及与wait/notify区别

park和unpark有以下特点

permit不能叠加,也就是说permit的个数要么是0,要么是1。也就是不管连续调用多少次unpark,permit也是1个。线程调用一次park就会消耗掉permit,再一次调用park又会阻塞住。举例如下

public class App {

public static void main(String[] args) throws Exception {

Thread boyThread = new Thread(new Runnable() {

@Override

public void run() {

System.out.println("boy: 我要吃鸡");

LockSupport.park();

System.out.println("boy: park1");

LockSupport.park(); // 第二次会阻塞住,因为只有一个permit

System.out.println("boy: park2");

System.out.println("boy: 开始吃鸡了");

}

});

Thread girlThread = new Thread(new Runnable() {

@Override

public void run() {

try {

Thread.sleep(4000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println("girl: 允许");

LockSupport.unpark(boyThread); // unpark两次,但是permit不会叠加

LockSupport.unpark(boyThread);

}

});

boyThread.start();

girlThread.start();

}

运行结果是

boy: 我要吃鸡

girl: 允许

boy: park1

unpark可以先于park调用。也就是我们在使用park和unpark的时候可以不用担心park的时序问题造成死锁。相比之下,wait/notify存在时序问题,wait必须在notify调用之前调用,否则虽然另一个线程调用了notify,但是由于在wait之前调用了,wait感知不到,就造成wait永远在阻塞。我们可以考虑下之前的一个例子 为什么WAIT必须在同步块中, 该例子中没有使用同步块产生死锁的原因是由于错误的条件判断,导致wait调用在notify之后,所以引起线程一直挂起。而unpark和park语义更加明确,它可以指明就是让某一个线程阻塞/接触阻塞。

park和unpark调用的时候不需要获取同步锁。我想原因应该也是和上述类似,我们可以先分析下wait/notify需要同步锁的原因是因为两个线程存在竞态关系,必须保证在正确的条件下调用wait/notify,如果判断错误了由于调用时序问题就会造成阻塞。而park/unpark不存在时序问题,所以线程可以继续运行。

park的一般用法。park方法也有可能在没有"任何理由"的情况下返回,所以通常要在一个循环中使用它并重新判断可以返回的条件。这一点和Object.wait方法一样,使用模式如下:

while (!canProceed()) { ... LockSupport.park(this); }}

当然如果没有任何条件就park的话,也不需要while了

3 参考

java park_park和unpark相关推荐

  1. java unpark_Java多线程学习:(wait,notify)--(await,signal)--(park,unpark)

    本文主要对Java.util.concurrent中锁的相关对比学习. 他们分别是: ① Object中wait和notify; ② Lock中lock.newCondition:condition. ...

  2. java park unpark_LockSupport(park/unpark)源码分析

    concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS框架借助于两个类: Unsafe(提供CAS操作) LockSupport(提供park/un ...

  3. Java LockSupport以及park、unpark方法源码深度解析

    介绍了JUC中的LockSupport阻塞工具以及park.unpark方法的底层原理,从Java层面深入至JVM层面. 文章目录 1 LockSupport的概述 2 LockSupport的特征和 ...

  4. java lock park_java并发编程-LockSupport中park与unpark基本使用与原理简单分析

    文章目录 java并发编程原理之---park与unpark 基本使用 情况一,先park再unpark,代码举例与分析 情况二,先unpark再park,代码举例与分析 特点 原理之park &am ...

  5. java并发编程学习三——wait/notify与park/unpark

    文章目录 一.wait/notify 1.1 api的使用 1.2 wait(long n)与sleep(long n) 1.3 正确使用方式 1.3.1 基本方式 1.3.2 保护性暂停模式 1.3 ...

  6. java unpark_LockSupport中的park与unpark原理

    LockSupport是用来创建locks的基本线程阻塞基元,比如AQS中实现线程挂起的方法,就是park,对应唤醒就是unpark.JDK中有使用的如下 LockSupport提供的是一个许可,如果 ...

  7. Java并发学习(五)-LockSupport里面的park和unpark

    学习AQS源码时候,发现当判断队列需要入队挂起时,都是调用LockSupport里面的park和unpark方法,例如: //park并且检查是否中断 private final boolean pa ...

  8. java帐篷_Java多线程之 Park和Unpark(十四)

    介绍 Park 和 Unpark 均是 LockSupport 类中的方法 //暂停当前线程 LockSupport.park(); //恢复某个线程 LockSupport.unpark(暂停线程对 ...

  9. Java中的锁-park/unpark

    park与unpark 在使用park与unpark的时候就在疑惑为什么先调用unpark时后park就不会阻塞,现在就总结一下原理 @Slf4j public class ParkAndUnpark ...

最新文章

  1. 无门槛领取80本圣经级技术书籍!技术改变世界!
  2. 《PHP精粹:编写高效PHP代码》——2.1节数据持久化和Web应用程序
  3. 210串口控制台-210移植printf不好使
  4. C 语言运算符优先级
  5. MapReduce-Reduce端join操作-步骤分析
  6. 【转】Lucene 工作原理
  7. 使用 C# 代码实现拓扑排序
  8. gson json和类转换_带有GSON和抽象类的JSON
  9. Simulink之单管非隔离直流斩波器
  10. 新建jsp报错“The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path”...
  11. sqlite排序规则
  12. java中是值传递引用传递_Java是按值传递而不是按引用传递
  13. 什么是管理大数据技术
  14. linkin大话设计模式--抽象工厂
  15. 数字电路基础知识(三) 复位设计-异步复位,同步释放
  16. CNN-LSTM预测北京雾霾浓度完整代码
  17. CCPROXY漏洞利用
  18. 如何下载720云上的全景图片?
  19. 带宽、传输速率、吞吐量的概念区别
  20. Cascade EF-GAN: 局部聚焦渐进式面部表情编辑

热门文章

  1. ncnn param文件及bin模型可视化解析
  2. 探索Redis设计与实现6:Redis内部数据结构详解——skiplist
  3. 爱彼迎全球招募5名南极科学考察团志愿者
  4. 长在不同部位逗逗的情况
  5. 时间序列分析之AR模型、MA模型和ARMA模型(二)
  6. android 组件导出,阳光沙滩-android组件化项目,build生成的文件重复的情况
  7. 超强AI绘画Midjourney使用教程
  8. html 合并单元格 步骤总结
  9. 博图sodt定时器的用法_西门子博图定时器指令说明
  10. DDR3基本概念2 - 上电复位时序