知识卡片

CLH排队降竞争

普通读书笔记卡 · 1524.a

内容

CLH(Craig、Landin、Hagersten 发明)自旋锁基于单向链表:线程通过一次 CAS 把节点接到队尾,之后只在前驱状态上做普通自旋,而非所有线程一起 CAS 同一变量。只有入队需要 CAS,把 [[自旋怕总线风暴]] 的问题分散成局部等待。AQS 是 CLH 的变种。已知短板:NUMA 架构下前驱内存位置远,自旋性能会下降。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第5章《JUC显式锁的原理与实战》5.2.6节《CLH自旋锁》(源文件:_epub-src/OEBPS/Text/chapter167.xhtml) - 结论依据:原文说明CLH锁“申请加锁的线程首先会通过CAS操作在单向链表的尾部增加一个节点,之后该线程只需要在其前驱节点上进行普通自旋”,“在节点加入队列之后,抢锁线程不需要进行CAS自旋,只需普通自旋即可……能大大减少CAS操作的数量,以避免CPU的总线风暴”,并指出“JUC中显式锁基于AQS抽象队列同步器,而AQS是CLH锁的一个变种”,因此推出本卡结论。 - 原始内容:由于CLH锁只有在节点入队时进行一下CAS的操作,在节点加入队列之后,抢锁线程不需要进行CAS自旋,只需普通自旋即可。因此,在争用激烈的场景下,CLH锁能大大减少CAS操作的数量,以避免CPU的总线风暴……JUC中显式锁基于AQS抽象队列同步器,而AQS是CLH锁的一个变种。