知识卡片

AQS是同步骨架

普通读书笔记卡 · 1529

内容

AQS 把同步器拆成两层:内部维护 FIFO 双向链表队列,抢锁失败的线程被封装成节点加入队列,锁释放后唤醒一个阻塞节点。AQS 是 [[CLH排队降竞争]] 的变种。子类只需定义共享资源 state 的获取释放语义,父类负责排队、阻塞、唤醒这套骨架。ReentrantLock、Semaphore 差异主要在语义钩子。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第6章《AQS抽象同步器的核心原理》6.1节《锁与队列的关系》(源文件:_epub-src/OEBPS/Text/chapter183.xhtml) - 结论依据:原文说明“AQS是JUC提供的一个用于构建锁和同步容器的基础类。JUC包内许多类都是基于AQS构建的,例如ReentrantLock、Semaphore、CountDownLatch、ReentrantReadWriteLock、FutureTask等”,并指出“AQS是CLH队列的一个变种……AQS队列内部维护的是一个FIFO的双向链表……每个节点其实是由线程封装的,当线程争抢锁失败后会封装成节点加入AQS队列中”,因此推出本卡结论。 - 原始内容:AQS是JUC提供的一个用于构建锁和同步容器的基础类……AQS是CLH队列的一个变种,主要原理和CLH队列差不多……每个节点其实是由线程封装的,当线程争抢锁失败后会封装成节点加入AQS队列中;当获取锁的线程释放锁以后,会从队列中唤醒一个阻塞的节点(线程)。