回答
一个线程获取锁失败后,会被包装为 Node 节点接入到 CLH 同步队列中,CLH 同步队列是一个 FIFO 的队列,理论上来说实现一个单向的就可以了,为什么要设计为 双向的呢?其实 JDK 注释就已经说明了答案:
prev
用于处理中断next
用于唤醒后续阻塞线程
详解
CLH 单向链表结构是这样的:
+------+ prev +-----+ +-----+
head | | <---- | | <---- | | tail
+------+ +-----+ +-----+
只有 prev 没有 next。
更好处理中断操作
AQS 提供了一个 acquireInterruptibly(int arg)
,该方法用于获取锁过程中处理中断信号。