使用

LockSupport.park()用来阻塞线程;LockSupport.unpark(t1)用来唤醒特定线程;

    public static void main(String[] args) {Thread t1 = new Thread(() -> {log.debug("start...");sleep(1);log.debug("park...");// 线程t1进入等待状态LockSupport.park();log.debug("resume...");}, "t1");t1.start();sleep(2);log.debug("unpark...");// 主线程 重新唤醒线程t1LockSupport.unpark(t1);}

park()和wait()的比较

  • wait,notify 和 notifyAll 必须配合 Object Monitor 一起使用,而 park,unpark 不必
  • park & unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么【精确】
  • park & unpark 可以先 unpark,而 wait & notify 不能先 notify

底层原理分析

  • 当前线程调用 Unsafe.park() 方法
  • 检查 _counter ,本情况为 0,这时,获得 _mutex 互斥锁
  • 线程进入 _cond 条件变量阻塞
  • 设置 _counter = 0
    总结:调用Unsafe.park() 时,如果_counter是0就进入阻塞状态,并且把_counter设置为0;

  • 调用 Unsafe.unpark(Thread_0) 方法,设置 _counter 为 1
  • 唤醒 _cond 条件变量中的 Thread_0
  • Thread_0 恢复运行
  • 设置 _counter 为 0
    总结:调用Unsafe.unpark(Thread_0),会将 _counter 设置为 1,随即唤醒了该线程,线程唤醒之后便又将该值设置为0

如果先执行unpark方法,再执行到了park()方法呢?

  • 调用 Unsafe.unpark(Thread_0) 方法,设置 _counter 为 1
  • 当前线程调用 Unsafe.park() 方法
  • 检查 _counter ,本情况为 1,这时线程无需阻塞,继续运行
  • 设置 _counter 为 0

这两个方法是不释放锁的

public class ParkDemo {private static Object object = new Object();public static void main(String[] args) throws InterruptedException {Thread t1 =new Thread(){@Overridepublic void run() {synchronized (object) {System.out.println("线程1进入临界区");LockSupport.park();System.out.println("继续执行");}}};t1.start();TimeUnit.SECONDS.sleep(5);synchronized (object) {System.out.println("进入临界区");}}
}

LockSupport类中的park()和unpark()相关推荐

  1. JDK1.8 Unsafe类中的park和unpark方法解析

    park是Unsafe类中的native方法,LockSupport类通过调用Unsafe类的park和unpark提供了几个操作.Unsafe的park方法如下 public native void ...

  2. LockSupport 中的 park 与 unpark

    在代码中调用 LockSupport.park() 时,会阻塞当前线程的执行. AtomicBoolean status = new AtomicBoolean(false);Thread waite ...

  3. java unpark_LockSupport中的park与unpark原理

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

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

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

  5. LockSupport的park和unpark

    LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语. Java锁和同步器框架的核心AQS:AbstractQueuedSynchronizer,就是通过调用Lo ...

  6. LockSupport 以及 park、unpark 方法

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

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

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

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

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

  9. 详解Java多线程编程中LockSupport类的线程阻塞用法

    转载自  详解Java多线程编程中LockSupport类的线程阻塞用法 LockSupport类是Java6(JSR166-JUC)引入的一个类,提供了基本的线程同步原语.LockSupport实际 ...

  10. LockSupport的park和unpark的原理

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

最新文章

  1. 数据库本地服务器为空,本地搭建的服务器访问不到数据库数据
  2. JPA实体关联关系,一对一以及转换器
  3. 并行编程——内存模型之缓存一致性
  4. Eigen(1)配置VS2015
  5. mysql的zip包的安装方法
  6. 「ng2」json组装和解析
  7. vim 快捷键 总结-编辑文件
  8. 风之大陆ios android账号互通,《风之大陆》安卓和ios互通吗
  9. C1驾照到期更换,驾照异地入迁,摩托驾驶证报名,记录
  10. bmp格式的图片怎么转jpg格式?怎么快速转图片格式?
  11. Photoshop CC 2017工具的使用
  12. 记录自己需要读的几本书
  13. Python学习笔记 -一到五
  14. html li 圆点 大小,ul li 定制圆点,list-style-image调整图片圆点大小 与 文字和图片排版...
  15. Cortex-M系列处理器对比
  16. JS 删除字符串中所有的数字
  17. DaVinci:跟踪器 - 窗口
  18. 无效的 ProgID“ShockwaveFlash.ShockwaveFlash” 导入 progid 时遇到错误: “ShockwaveFlash.ShockwaveFlash”
  19. python程序运行结果始终为0_下列Python程序的运行结果是 x=0 y=True print(xy and \'A\'\'B\')...
  20. Halcon评价图像清晰度的算子

热门文章

  1. 卡方检验2-python代码实现
  2. cmd查看mysql版本_mysql安装-必会
  3. 为什么必须在主线程操作UI
  4. The Basic Knowledge of Graph(图的基本知识)
  5. 137.只出现一次的数字II
  6. php5.6软件下载,【PHP下载】PHP for Linux 5.6.6-ZOL软件下载
  7. 钉钉微应用怎么进入_海目星激光张荣:激光焊接在锂电池生产应用中越来越多...
  8. SRMD:Learning a Single Convolutional Super-Resolution Network for Multiple Degradations
  9. leetcode485、448、414
  10. Dropout浅层理解