AQS(AbstractQueuedSynchronizer)使用双向链表的主要原因是为了实现等待队列(Wait Queue)。这个等待队列是用于管理在同步器上等待的线程,例如在获取锁时发现锁被占用,线程就会加入到等待队列中等待。
使用双向链表的优点包括:
- FIFO(先进先出)的顺序:
- 双向链表可以保持线程加入等待队列的顺序,即先加入的线程排在队列前面,后加入的线程排在队列后面。这有助于实现公平性,即等待时间较长的线程更有机会先获得锁。
- 便于在两端进行操作:
- 双向链表支持在队列的两端进行高效的操作,例如在头部添加新节点、在尾部移除节点等。这对于在等待队列中的线程状态的管理和维护是非常有用的。
- 节点的前驱和后继信息:
- 每个等待队列节点都有指向其前驱节点和后继节点的引用。这使得在等待队列中的线程状态的变化可以高效地传播,例如当前驱节点释放锁时,可以唤醒后继节点。这对于实现线程的唤醒和阻塞是关键的。
- 简化队列操作:
- 双向链表的结构可以简化在队列中的节点插入、删除和移动等操作,而这些操作是在多线程环境下需要高效完成的。
使用双向链表作为等待队列的底层数据结构,是为了提供高效的队列操作,保持线程等待的有序性,同时支持在节点之间传播状态信息,从而实现了 AQS 的核心同步机制。这种设计使得 AQS 能够灵活地支持各种同步器的实现。