基于AQS分析Condition

21 篇文章 0 订阅

对于Object的wait和notify方法我们已经很熟悉了,同时也知道与之相似的Condition接口的await和signal,具体用法这里不讲,我们基于上一篇AQS的介绍来讲讲Condition的实现原理

等待队列

Condition的实现类ConditionObject是AQS的内部类,其实现是需要获取Lock相关的锁,Lock其实只是一个工具类,其锁的实现是基于内部类提供的,而这些内部类都继承了AQS,Condition是AQS的内部类,Lock对象createCondition其实就是在用AQS创建Condition

我们知道在AQS中存在一个同步队列,当线程没有获取到锁时,同步器会将线程和相关状态信息封装成一个Node放入同步队列中,而Condition中也存在着一个等待队列(FIFO),等待的线程会被封装成Node放入这个等待的队列中,通知时会从这个等待队列中移出

一个AQS对象拥有一个同步队列以及多个Condition对应的等待队列,当线程在某个Condition上await时(要知道这个时候该线程本身是已经拿到锁的,因此其本身是一个在同步队列头部的Node),会将线程封装成一个新Node(与同步队列中的Node类型一样)放入该Condition对应的等待队列中,同时唤醒同步队列的后驱节点,并调用LockSupport工具类对当前这个线程进行阻塞。

有其他线程在该Condition进行通知时(此时这个线程也是持有锁的),会将等待队列中的头节点移动到同步队列的尾端,并调用LockSupport工具类对该节点线程取消阻塞,该节点会在同步队列中进行锁的争抢,当成功获取锁时,会从线程之前await的地方返回

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值