Condition也是 AQS 中很重要的一块内容,可以先看段示例代码,这段代码应该来自于Doug Lea大大,可以在 javadoc 中的 condition 部分找到,其实大大原来写过基于 synchronized 实现的,后面我也贴下代码
1 | import java.util.concurrent.locks.Condition; |
介绍下 Condition 的结构
1 | public class ConditionObject implements Condition, java.io.Serializable { |
主要的就这么点,而且也复用了 AQS 阻塞队列或者大大叫 lock queue中同样的 Node 节点,只不过它没有使用其中的双向队列,也就是prev 和 next,而是在 Node 中的 nextWaiter,所以只是个单向的队列,没使用 next 其实还有个用处,后面会提到,看下结构的示意图
然后主要是看两个方法,await 和 signal,
先来看下 await
1 | /** |
添加条件队列节点
1 | /** |
清理取消的节点
1 | /** |
完全释放锁
1 | /** |
判断是否在阻塞队列中
1 | /** |
await 的逻辑差不多就是这样子,主要的就是把自己包成一个 Node 节点,waitStatus 的状态是 CONDITION,挂在等待队列的最后,然后完全释放锁,park 等待
signal
1 | /** |
这里其实就是把 condition 等待队列的第一个未取消的节点入队到阻塞队列去争锁
附录
synchronized 版的 BoundedBuffer
1 | /* |

