1.概述
AQS(AbstractQueuedSynchronizer)是 Java 中用于构建同步器的一个基础框架。它在实现同步器时通常使用双向链表的数据结构,主要是为了管理等待线程的队列。以下是为什么要使用双向链表的一些原因:
-
FIFO(先进先出)顺序
:在多线程环境下,要确保公平性和按照线程请求的顺序获取锁,需要使用队列来管理等待线程。双向链表可以很容易地支持FIFO顺序,因为它可以在队列的前端和后端进行高效的插入和删除操作,确保线程按照它们请求锁的顺序进行处理。 -
高效的入队和出队操作
:双向链表的结构允许在队列的头部和尾部快速进行元素的插入和删除操作,而不需要遍历整个队列。这对于高度并发的情况下非常重要,因为在这种情况下,需要尽量减小对队列的操作所带来的性能开销。 -
支持条件等待
:AQS 不仅用于互斥锁(如 ReentrantLock)的实现,还支持条件等待(Condition)。条件等待需要能够高效地将线程从条件队列移动到主等待队列,并在条件满足时移回条件队列。双向链表可以支持这种操作,因为它们允许线程在队列之间移动。 -
易于管理等待线程状态
:AQS 使用了一个内部类 Node 来表示等待队列中的节点,这些节点通过双向链表连接。这些节点可以很容易地跟踪线程的状态,例如,是否已被取消、是否被中断等。