LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语。

Java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用LockSupport.park()和LockSupport.unpark()实现线程的阻塞和唤醒的。LockSupport很类似于二元信号量(只有1个许可证可供使用),如果这个许可还没有被占用,当前线程获取许可并继续执行;如果许可已经被占用,当前线程阻塞,等待获取许可。

LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。因为park() 和 unpark()有许可的存在;调用 park() 的线程和另一个试图将其 unpark() 的线程之间的竞争将保持活性。

LockSupport函数列表

// 返回提供给最近一次尚未解除阻塞的 park 方法调用的 blocker 对象,如果该调用不受阻塞,则返回 null。
static Object getBlocker(Thread t)
// 为了线程调度,禁用当前线程,除非许可可用。
static void park()
// 为了线程调度,在许可可用之前禁用当前线程。
static void park(Object blocker)
// 为了线程调度禁用当前线程,最多等待指定的等待时间,除非许可可用。
static void parkNanos(long nanos)
// 为了线程调度,在许可可用前禁用当前线程,并最多等待指定的等待时间。
static void parkNanos(Object blocker, long nanos)
// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
static void parkUntil(long deadline)
// 为了线程调度,在指定的时限前禁用当前线程,除非许可可用。
static void parkUntil(Object blocker, long deadline)
// 如果给定线程的许可尚不可用,则使其可用。
static void unpark(Thread thread)

说明:LockSupport是通过调用Unsafe函数中的接口实现阻塞和解除阻塞的。

park和wait的区别

在调用对象的Wait之前当前线程必须先获得该对象的监视器(Synchronized),被唤醒之后需要重新获取到监视器才能继续执行。

而LockSupport并不需要获取对象的监视器。LockSupport机制是每次unpark给线程1个"许可"——最多只能是1,而park则相反,如果当前线程有许可,那么park方法会消耗1个并返回,否则会阻塞线程直到线程重新获得许可,在线程启动之前调用 park/unpark方法没有任何效果。

因为它们本身的实现机制不一样,所以它们之间没有交集,也就是说LockSupport阻塞的线程,notify/notifyAll没法唤醒.

总结下 LockSupport的park/unpark和Object的wait/notify:

  • 面向的对象不同;
  • 跟Object的wait/notify不同LockSupport的park/unpark不需要获取对象的监视器;
  • 实现的机制不同,因此两者没有交集。

虽然两者用法不同,但是有一点, LockSupport 的park和Object的wait一样也能响应中断.

转载于:https://www.cnblogs.com/moonandstar08/p/5132012.html

LockSupport的park和unpark相关推荐

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

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

  2. LockSupport 的 park 和 unpark 以及线程中断对 park 的影响

    park() Thread t1 = new Thread(() -> {System.out.println("t1 park");LockSupport.park(); ...

  3. LockSupport的park和unpark的原理

    我们知道各种并发框架如CountDownLatch.CyclicBarrier和Semaphore是基于AQS (AbstractQueuedSynchronizer)框架实现的,AQS框架借助于两个 ...

  4. LockSupport 以及 park、unpark 方法

    一.LockSupport 是 jsr 166 中新增的 juc 工具类. LockSupport 类主要用于创建锁和其他同步类来实现线程阻塞. 这个类与他使用的每个线程进行关联, 如果可用就立即 p ...

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

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

  6. LockSupport的park/unpark分析

    https://blog.csdn.net/u013978512/article/details/120011860?spm=1001.2014.3001.5501 这篇文章我们讲了AQS的实现过程, ...

  7. c语言goord函数,park、unpark、ord 函数使用方法(转)

    park,unpark,ord这3个函数,在我们工作中,用到它们的估计不多. 我在最近一个工作中,因为通讯需要用到二进制流,然后接口用php接收.当时在处理时候,查阅不少资料.因为它们使用确实比较少, ...

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

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

  9. LockSupport park和unpark

    前言 在上一篇文章线程池返回值Future中,源码分析线程池结果获取阻塞的原因. LockSupport.unpark(t); LockSupport.parkNanos(this, nanos);或 ...

最新文章

  1. 微软鲍尔默回应被苹果超越:将开发更好产品
  2. UIBarButtonItem使用困惑
  3. python 目录遍历 目录文件列表 介绍
  4. linux中awd的详细使用方法,求教awdflash的使用方法,详细些,我是初學者。
  5. “AI+”农业向农民致敬-丰收节交易会:谋定工业反哺农业
  6. 怎么用cmd关闭系统弹窗_C盘空间越来越小怎么办?5招帮你解决问题!
  7. linux 如何自定义安装路径,Linux下安装mysql并自定义数据的存储路径
  8. SharePoint2010升级到SharePoint2013操作手册
  9. 数据库一些开发者了解的操作
  10. udp程序启动后检测都是未启动_【例子教程】联想Leez P710 物联网AI物体检测
  11. 李宏毅自然语言处理——多语言BERT
  12. linux 使用yum给已安装的软件降级
  13. 显示桌面 图标 创建可以新建一个txt文件,把以下内容放入,名字改为显示桌面 .scf...
  14. A类业余无线电台操作证书知识总结
  15. 软件设计师 2022年上半年下午题
  16. 硬件工程师的面试问题
  17. java 转义符 输出,Java转义字符怎么输出的
  18. BUUCTF:FLAG
  19. 柠檬班Python高级软件测试开发2022年
  20. php8最新版本特性,PHP8 了解新特性

热门文章

  1. 在Mono 2.8上部署ASP.NET MVC 2
  2. 数据结构之顺序表(二)
  3. 【BZOJ 3339 / BZOJ 3585 / luogu 4137】Rmq Problem / mex
  4. 【云周刊】第205期:阿里云重磅开源实时计算平台Blink,挑战计算领域的“珠峰”...
  5. PIX525故障一例,求解
  6. ROS机器人程序设计(原书第2版)2.3 理解ROS开源社区级
  7. 稳定和性能如何兼顾?58大数据平台的技术演进与实践
  8. maven GroupId 和ArtifactId的含义
  9. Sublime 资源汇总
  10. sublime text 2快捷键总结