首页 > 其他分享 >Condition

Condition

时间:2023-08-03 10:36:44浏览次数:22  
标签:队列 阻塞 线程 thread2 thread1 唤醒 Condition

jdk1.5后,提供了Condition接口,主要常用的实现类是AQS里的ConditionObject;常用的方法await(),single()刚好对应Object类的wait(),notify();区别在于前者能指定唤醒阻塞的线程,看ArrayBlockedList源码可以看到,其阻塞的实现就是利用Condition实现的。下面开始研究下源码的实现。

首先看常见的用法



上面代码模拟了两个线程的同步的过程,首先condtion.await()和single()必须是在加锁范围内执行的,通过上面的执行步骤,可以清晰的理解线程之间是如何阻塞和唤醒的。

下面就按上述的场景流程,看下await()和single()过程中做了什么。

之前还得先了解下ConditonObject的结构,Node就是AQS里的节点,可以看到它自己有一个队列,和AQS的线程队列不是同一个。


1.thread1.lock()

        thread1获取锁

2.thread2.lock()

        thread2获取锁失败,进入线程队列并阻塞,最后AQS的线程队列为


3.conditon1.await()


3.1 addConditionWaiter


新建了一个Node,(Node.CONDITION=-2),firstWaiter和lasterWaiter都指向它,注意这里的队列和之前的线程队列不是同一个队列。


3.2fullyRelease


3.3 release

调用release方法,thread1释放锁


3.4 unparkSuccessor


最后将thread2阻塞唤醒

3.6 isOnSyncQueue

返回false,下一步park理解为阻塞在当前位置,唤醒后也从这里继续往下执行。

这次thread2被唤醒继续执行,thread1被阻塞。此时AQS线程队列



4.thread2.lock()上一步唤醒阻塞,这里继续往下执行,thread2获取到锁

5.condition1.single()


5.1 isHeldExclusively()


是否占有排它锁,返回ture

5.2 doSignal


firstWaiter和lastWaiter都为null

5.3 transferForSignal


最后唤醒thread1,等thread2执行完unlock()释放锁后,thread1继续执行。

 

大体通过代码自己分析了一遍过程,里面还有很多细节需要深究

标签:队列,阻塞,线程,thread2,thread1,唤醒,Condition
From: https://www.cnblogs.com/zeenzhou/p/17602587.html

相关文章

  • c++11 std::condition_variable
    std::condition_variable需要配合unique_lock使用,wait(unique_lock<mutex>&)notify_one()调用时,只有随机一个wait()线程会得到通知notify_all(),所有wait()线程会被通知并得到执行wait()调用会阻塞当前线程wait()线程中用到的unique_lock不会阻塞notify线程中的锁//condit......
  • @Conditional注解
    1.介绍@Conditional注解@Conditional注解源码@Conditionl注解简单说明@Conditional注解所属包org.springframework.context.annotation.Conditional注解作用范围{ElementType.TYPE,ElementType.METHOD}类、接口、注解、枚举以及方法注解生命周期@Retention(RetentionPolicy......
  • 条件随机场(conditional random field,CRF)模型初探
    条件随机场(conditionalrandomfield,CRF)模型初探1.条件随机场,一种特殊的概率图模型结构我们知道,从图结构角度来说,概率图模型可以分为以下两种:基于有向图的贝叶斯网:具备有向依赖性基于无向图的马尔科夫网:具备无向依赖性条件随机场是一个在变量子集上存在有......
  • 详细说明Python中的Condition类(转)
    addbyzhj: 之前只知道在Queue的实现中使用了Condition对象,可以实现生产者消费者功能,但具体怎么使用Condition还是一知半解,看了这篇文章,终于懂了。很多事情往往一时看不明白,看得多了,某一天就突然明白了。 原文:https://blog.csdn.net/ckk727/article/details/99950843作者:二......
  • 【Spring】条件装配 @ConditionalOnClass @ConditionalOnBean
    @ConditionalOnClass 是SpringFramework提供的一个注解,用于在应用程序上下文加载过程中根据类的存在与否来决定是否创建或配置某个bean。通常情况下,当应用程序上下文加载时,Spring会根据配置文件或注解等方式定义的bean定义来创建对象,并将其加入到bean集合中。然而,有时......
  • TypeScript 条件类型(Conditional Types)以及 infer 关键字
    什么是条件类型条件类型可以让程序根据输入的类型来决定输出的类型是什么,也就是说根据不同的输入类型来确定输出的类型。条件类型的形式有点类似于JS中的条件表达式(condition?trueExpression:falseExpression):file:[条件类型的规则]SomeTypeextendsOtherType?TrueTyp......
  • 【pyhton】条件变量Condition
    条件变量Conditionacquire — 线程锁,注意线程条件变量Condition中的所有相关函数使用必须在acquire /release 内部操作;release —释放锁,注意线程条件变量Condition中的所有相关函数使用必须在acquire /release 内部操作;wait(timeout) — 线程挂起(阻塞状......
  • 记@ConditionalOnMissingBean注解导致bean注入失败的问题
    1.背景springboot项目,引入nacos做配置中心,pom.yaml导入依赖<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.12</ver......
  • 条件注解之@ConditionalOnProperty注解:通过配置文件的配置来控制配置类是否加入spring
    一、条件注解分类常见的@ConditionalOnxxx开头的注解我们称之为条件注解,常见的条件注解有class条件注解:@ConditionalOnClassbean条件注解:@ConditionalOnBean属性条件注解:@ConditionalOnProperty…@ConditionalOnProperty:如果有指定的配置,条件生效;@ConditionalOnBean:如果......
  • autosys condition check
    example:condition:  s(xxx_DailyPositionGenerate)    &  s(xxx_BofaFileUpload)   autosysonlycheckthejobstatus,ifit'ssuccesswheneveritarrivedsuccess,theconditionwill be meet. thefixmethodisweaddanotherconditionchecks(xxx_Bo......