ReentrantLock锁的实现是基于AQS实现的,所以先简单说下AQS:
AQS是AbstractQueuedSynchronizer缩写,顾名思义:抽象的队列同步器,它是JUC里面许多同步工具类实现的核心
其实简单来说AQS有两个核心,一个是volatile修饰的int类型state,这个是记录处于等待中需要持有锁和正在持有锁的线程数量
/**
* The synchronization state.
*/
private volatile int state;
第二个就是Node内部类,他是AQS里面FIFO双向队列节点的实现,他的一些属性如下:
static final class Node { volatile int waitStatus;//等待状态
volatile Node prev;//前驱节点
volatile Node next;//后继节点
volatile Thread thread;//申请同步状态的线程
Node nextWaiter;//等待节点的后继节点(后续出AQS详细篇再细讲)
}
这种结构可以从任意的一个节点开始很方便的访问前驱和后继节点。每个Node由线程封装,当线程竞争失败后会加入到AQS队列中去。
基于这些再继续聊下ReentrantLock的公平和非公平锁的实现
ReentrantLock锁的实现基于AQS,如下sync抽象内部类:
abstract static class Sync extends AbstractQueuedSynchronizer{
abs