2024-03-23  阅读(3)
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/4099643785

回答

一个线程获取锁失败后,会被包装为 Node 节点接入到 CLH 同步队列中,CLH 同步队列是一个 FIFO 的队列,理论上来说实现一个单向的就可以了,为什么要设计为 双向的呢?其实 JDK 注释就已经说明了答案:

  • prev 用于处理中断
  • next 用于唤醒后续阻塞线程

详解

CLH 单向链表结构是这样的:

       +------+  prev +-----+       +-----+
  head |      | <---- |     | <---- |     |  tail
       +------+       +-----+       +-----+

只有 prev 没有 next。

更好处理中断操作

AQS 提供了一个 acquireInterruptibly(int arg),该方法用于获取锁过程中处理中断信号。