知识卡片
同步队列排失败者
内容
竞争失败的线程不会无限乱抢同一个锁变量,而是被封装成 Node 加入 AQS 内部的 FIFO 双向链表队列。锁释放时只唤醒一个阻塞节点(通常是紧邻后继),而非唤醒所有等待线程去抢,让竞争从”所有线程同时冲”变成”前驱释放后唤醒后继”,避免惊群。这个先排队的结构也让公平性、中断控制有了实现落脚点。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第6章《AQS抽象同步器的核心原理》6.1节《锁与队列的关系》(源文件:_epub-src/OEBPS/Text/chapter183.xhtml)
- 结论依据:原文说明“AQS队列内部维护的是一个FIFO的双向链表……每个节点其实是由线程封装的,当线程争抢锁失败后会封装成节点加入AQS队列中;当获取锁的线程释放锁以后,会从队列中唤醒一个阻塞的节点(线程)”,因此推出本卡关于失败线程排队、按序唤醒的结论。
- 原始内容:每个节点其实是由线程封装的,当线程争抢锁失败后会封装成节点加入AQS队列中;当获取锁的线程释放锁以后,会从队列中唤醒一个阻塞的节点(线程)。