本文是AQS与CLH相关论文学习系列第一篇。 系列其他文章链接如下
参考文章
前言
AbstractQueueSynchronizer 是 jdk1.5 及之后版本中 java.util.concurrent 包里很多同步器的实现基础, 例如locks, barriers 很多类都是基于 AbstractQueueSynchronizer 实现的, 后面将其简称为AQS
可以说, AQS 是 java 同步器的一个核心, 因此掌握AQS 的设计原理非常有助于学习并发的相关知识。 关于 AQS , 作者 Doug Lea 专门通过论文《Building FIFO and priority-queueing spin locks from atomic swap》【参考文章1】 进行了详细的描述, 因此笔者也是从这篇论文开始学习。
Doug Lea 论文中指出, AQS 的核心设计其实是一个 CLH 锁变体。 CLH 锁的命名来源于三位核心作者 Craig、Landin and Hagersten 的姓名首字母缩写。
笔者起先阅读 一些相关博客中提到 CLH 锁时, 一直以为 CLH 锁是 Craig、Landin and Hagersten , 以共同作者的身份发表了一篇论文, 设计了这个锁机制, 在论文检索的过程中才发先:
-
Craig 最早发布的论文 《Building FIFO and priority-queueing spin locks from atomic swap》[1993] 最先描述了这种锁, 但是为这种锁命名
-
Landin and Hagersten 在 《Efficient Software Synchronization on Large Cache Coherent Multiprocessors》[1994] 这一篇文章中, 提出了一个 LH 锁, 其本质和 Craig 论文中的锁一样
-
Landin and Hagersten 在另一篇 《Queue Locks on Cache Coherent Multiprocessors》 [1994] 发表的论文中, 提到了 LH 锁已经在 Craig 的论文中描述过了, 与自己的工作相互独立。
笔者对于学界如何判定两个不同时间发布, 但核心内容重复的论文如何判定是否相互独立创作也是很感兴趣, 希望能有大佬指导。
先修知识
-
CPU 多核架构的的并发问题
- 由于操作系统的存在, 应用程序开发者通常关心的问题是进程级别的并发问题, 讨论单机多进程或多线程并发问题时, 程序员脑中的模型通常是一个CPU, 多个进程轮流获得 CPU 时间片访问共享数据。
- 但实际上,由于现代计算机已经广泛地采用了多核技术提升单机性能,多核 CPU 如何区别于单核 CPU 高效访问共享资源, 成为了一个新的值得软件设计者关心的问题
-
一致内存访问架构 ( Uniform Memory Access,UMA)
- 在 NUMA 架构出现之前, 多核 CPU 访问内存的架构模型是下图, 图片来源于【参考文章一】。这种架构下,多个 CPU 核心共同总线访问同一块物理内存 , 每一个 CPU 核心有自己的缓存, 用于提升内存数据访问速度