之前写了一遍讲解ConditionObject如何实现条件队列的文章,有些拘泥实现细节、讲得不够清晰。本文再次把ConditionObject的主体实现逻辑讲解一遍,把关键的实现要点总结出来,形成要点。看完这篇文章可以保证你不必再去阅读ConditionObject的源码并且已经深度掌握其实现细节,保证你今后写代码、面试、分析问题够用了。
1. 首先,条件队列ConditionObject作为
AbstractQueuedSynchronized(以下简称AQS)的非静态内部类,通过AQS.this引用外部类实例(如图1)。为什么需要这种关联?因为多个线程可能会并发调用await(),而await()需要修改共享的条件队列(一个单链表和AQS上的同步队列,把线程结点在这两个队列之间移动。为了保证并发访问的线程安全性,需要锁来保护,而外部类AQS正是提供锁功能的,所以ConditionObject以这种方式关联AQS类。所以,ConditionObject需要AQS锁来以独占方式修改条件队列和同步队列,ConditionObject内部不再考虑如何修改共享数据,这就是为什么使用Condition前必须先持有锁的原因。
2. 其次,AQS提供一个同步队列(用于实现锁),而ConditionObject提供一个条件队列,且AQS可以关联多个条件队列,如下图所示。在同步队列中的线程结点处在对于锁的竞争中,而在条件队列中等待的线程并不竞争锁&#x