你是否使用过java并发工具包中的Lock和Condition。本文分析一下JDK是如何实现Condition条件队列的,对你今后的使用或许有帮助。如果你觉得分析源码太累,看不懂,可以通过阅读本文以大致了解java显式锁的实现,保证你面试够用了。
约定:
- 本文AQS均指java.util.concurrent.locks.AbstractQueuedSynchronizer类。
- 本文CAS操作指的是compareAndSet 或 compareAndSwap原子操作,需要您自行学习相关基础。
AQS如何实现条件队列
AQS提供一个内部类ConditionObject,由这个ConditionObject实现条件队列。
例如,经典代码:
Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); ... lock.lock(); try { while ( 某条件A ) { condition.await(); } // 条件A满足时应执行的代码 } finally { lock.unlock(); }
以上代码中的condition实际就是ConditionObject类。
首先,分析其声明:
public class ConditionObject implements Condition, java.io.Serializable {
1. 首先,它实现了java.util.concurrent.locks.Condition接口,表示自己是一个条件队列。作为内部类,它没有被static关键字修饰,表示它不能脱离外部的AQS类独立存在