基于AQS分析Condition

对于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的地方返回

发布了98 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Mutou_ren/article/details/103748477