当前位置: 代码迷 >> 综合 >> 受益匪浅——java并发工具包ConditionObject实现要点图解
  详细解决方案

受益匪浅——java并发工具包ConditionObject实现要点图解

热度:98   发布时间:2023-12-06 14:21:40.0

之前写了一遍讲解ConditionObject如何实现条件队列的文章,有些拘泥实现细节、讲得不够清晰。本文再次把ConditionObject的主体实现逻辑讲解一遍,把关键的实现要点总结出来,形成要点。看完这篇文章可以保证你不必再去阅读ConditionObject的源码并且已经深度掌握其实现细节,保证你今后写代码、面试、分析问题够用了。

1. 首先,条件队列ConditionObject作为
AbstractQueuedSynchronized(以下简称AQS)的非静态内部类,通过AQS.this引用外部类实例(如图1)。为什么需要这种关联?因为多个线程可能会并发调用await(),而await()需要修改共享的条件队列(一个单链表和AQS上的同步队列,把线程结点在这两个队列之间移动。为了保证并发访问的线程安全性,需要锁来保护,而外部类AQS正是提供锁功能的,所以ConditionObject以这种方式关联AQS类。所以,ConditionObject需要AQS锁来以独占方式修改条件队列和同步队列,ConditionObject内部不再考虑如何修改共享数据,这就是为什么使用Condition前必须先持有锁的原因。

java并发工具包ConditionObject实现要点图解

2. 其次,AQS提供一个同步队列(用于实现锁),而ConditionObject提供一个条件队列,且AQS可以关联多个条件队列,如下图所示。在同步队列中的线程结点处在对于锁的竞争中,而在条件队列中等待的线程并不竞争锁&#x

  相关解决方案