一、前言
本篇内容是为之后的内容AQS打下基础,AQS又称 Abstract Queued Synchronizer ,即抽象队列同步器,Java中,基于 AQS 实现了很多著名的锁,如:重入锁(ReentrantLock)、读写锁(ReadWriteLock)、共享锁(CountDownLatch)若设置为1则等同于互斥锁,等。因此,为了深入分析AQS,我将重要的内容都拆解出来,从一个一个的知识点逐个击破。
二、CLH
CLH(Craig,Landin and Hagersten)是三个人,共同发明了一个可扩展、高性能、公平且基于自旋锁的链表;链表中的每个线程只在本地自旋前一个节点的状态,即该节点(线程)不断自旋获取前一个节点的状态;每个节点都有一个状态(要么自旋,要么释放锁)。
在AQS中,用到的数据结构是 CLH 的变体:
+-------+ prev +-------+ +-------+
head | A |
+-------+ +-------+ +-------+
上图是AQS中CLH的变体结构,该结构是:
一个 FIFO(first-in-first-out)队列;
新的等待获取锁的线程先加入队尾(tail);
如果队列是空,则第一个新加入的节点立即获得锁;
新加入的线程本地自旋前一个节点的状态(如 C 不断自旋获取 B 的状态);
(当A释放锁时,B成为第一个节点),头节点并不能保证