首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

LockSupport中的park与unpark原理

LockSupport是用来创建locks的基本线程阻塞基元,比如AQS中实现线程挂起的方法,就是park,对应唤醒就是unpark。...调用unpark的时候,如果许可本身不可用,则会使得许可可用 许可只有一个,不可累加 park源码跟踪 park的声明形式有一下两大块 image.png 一部分多了一个Object参数,作为blocker...unpark; 2:其它线程中断了线程;3:发生了不可预料的事情;4:指定的deadLine已经到了 以park的源码为例public static void park(Object blocker)...本身就是发放许可,并通知等待的线程,已经可以结束等待了 总结 park/unpark能够精准的对线程进行唤醒和等待。...linux上的实现是通过POSIX的线程API的等待、唤醒、互斥、条件来进行实现的 park在执行过程中首选看是否有许可,有许可就立马返回,而每次unpark都会给许可设置成有,这意味着,可以先执行unpark

2.2K41
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Unsafe类park和unpark方法源码深入分析(mutex+cond)

    本文结合源码对Unsafe的park和unpark方法进行了完整全面的梳理,并对部分参考博客中存在的错误描述进行说明。...LockSupport类的park/unpark方法可以更简单灵活地实现synchronized关键字 + Object类的wait/nofity方法所达到的让线程按照指定顺序执行的效果(详见参考博客1...),而LockSupport底层就是通过调用Unsafe类的park和unpark方法来实现的。...由参考博客2可知(建议先读完参考博客2),每个Thread都包含一个Parker成员变量,Unsafe的park/unpark方法最终就是调用Parker类的park/unpark方法。...这里先给出一张park和unpark底层的实现时序图: 由图可知,pthread_cond_wait方法会先操作条件变量,然后释放锁,接着阻塞当前线程,等待condition的唤醒信号。

    44030

    JUC-parkunpark

    park与unpark 在使用park与unpark的时候就在疑惑为什么先调用unpark时后park就不会阻塞,现在就总结一下原理 @Slf4j public class ParkAndUnpark...(t1); } } 可以看到这个还是比较符合我们正常情况,因为先执行的是park再执行的是unpark 那么先执行unpark再执行park呢?...park加锁后没有unpark为啥还是可以执行?...& unpark 是以线程为单位来【阻塞】和【唤醒】线程,而 notify 只能随机唤醒一个等待线程,notifyAll 是唤醒所有等待线程,就不那么【精确】 park & unpark 可以先 unpark...为啥先调用unpark时,第一次park不会阻塞其原因就是调用时候设置了_counter 为 1 所以第一次不会阻塞,但是不管调用多少次unpark只会设置为1

    14230

    并发锁LockSupport原理剖析,四千字多图讲解+多例子+代码分析

    04 park 与 unpark 的顺序 下面来探讨LockSupport的park和unpark的执行顺序的问题。正常来说一般是先park线程阻塞,然后unpark来唤醒该线程。...Unsafe类提供了很多底层的和不安全的操作,主要用了它park、unpark和putObject三类方法,park和unpark方法可以看出是对底层线程进行操作,而putObject方法则是将对象设置为...类似地,我们队park和unpark进行分析。这个例子与上面的wait/notify例子逻辑几乎相同,唯一不同的是阻塞和唤醒操作改为了park和unpark。...从此可以看出park/unpark方式的执行顺序不影响唤醒,这是因为park/unpark是使用了许可机制,如果先调用unpark去释放许可,那么调用park时就直接能获取到许可而不必等待。 ?...unpark方法则是间接调用Unsafe对象的unpark方法 ? 10 总结 本文讲解了JDK并发包中锁支持类LockSupport,它主要的功能就是实现线程的阻塞和唤醒,而且使用了许可机制。

    3K60

    JUC在深入面试题——三种方式实现线程等待和唤醒(waitnotify,awaitsignal,LockSupport的parkunpark)

    3. unpark源码查看 public static void unpark(Thread thread) { if (thread !...与前两者比的优点 park/unpark不需要在同步块或者方法内才能执行,解决了上面两种不在同步块或者方法就报错的情况。 park/unpark不需要先执行park,在执行unpark,无需在意顺序。...每个线程都有一个相关的permit,permit最多只有一个,重复调用unpark也不会积累凭证。 阻塞原因:根据上面代码,我们会先执行线程B,调用unpark方法,虽然进行两次unpark。...此时A线程开始,来到第一个park,permit消耗后为0,为0是阻塞,等待unpark,此时没有unpark了,所以一直陷入阻塞。...== 因为凭证的数量最多为1(不能累加),连续调用两次 unpark和调用一次 unpark效果一样,只会增加一个凭证;而调用两次park却需要消费两个凭证,证不够,不能放行。

    68720

    LockSupport的 park 方法是怎么响应中断的?

    unpark unpark会唤醒被park的指定线程。但是,这里要说明的是,unpark 并不是简单的直接去唤醒被park的线程。看下JDK的解释: ? unpark只是给当前线程设置一个许可证。...这句话的意思,其实是指,park和unpark的调用顺序无所谓,只要unpark设置了这个许可证,park方法就可以在任意时刻消费许可证,从而不会阻塞方法。...而park/unpark使用就比较灵活了,没有这个限制,可以在任何地方使用。 2) park/unpark 使用时没有先后顺序,都可以使线程不阻塞(前面代码已验证)。...前"); LockSupport.unpark(parkedThread); System.out.println("unpark后"...打印结果如下: park前 unparkunpark后 park后

    3.2K10

    大厂面试必会:AQS LockSupport Unsafe之间的关系

    文章目录 概述 AQS与Unsafe AQS 与 LockSupport LockSupport 与 Unsafe Unsafe park unpark 原理 LockSupport 与 wait notify...方法直接调用 Unsafe#unpark public static void unpark(Thread thread) { if (thread !...= null) UNSAFE.unpark(thread); } Unsafe park unpark 原理 在Linux系统下,是用的Posix线程库pthread中的mutex(互斥量),condition...且在 park unpark 过程中,保护了一个_counter的变量。 当调用park时,先尝试能否直接拿到“许可”,即判断_counter>0时,如果成功,则把_counter设置为0,并返回。...notify notifyAll 无法精确唤醒某一个线程,unpark(Thread)可以做到 LockSupport#unpark(Thread)可以先于该 Thread park()前执行,这种情况下该

    60720
    领券