通过简易的模仿公平锁后,对ReentrantLock的源码进行了学习。
先对节点Node的属性进行了解。
// 枚举: 共享模式
static final Node SHARED = new Node();
// 枚举: 独占模式
static final Node EXCLUSIVE = null;
// 表示当前节点处于 取消状态
static final int CANCELLED = 1;
// 表示当前节点需要唤醒的 后继节点
static final int SIGNAL = -1;
waitStatus主要是通过状态判断节点
// node转台, 可选值 (0,SINGAL -1 ,CANCELLED 1
// 0: 默认状态
// >0 取消状态
// == -1 ,表示当前node如果是head节点时,释放锁之后,需要唤醒他的后继节点
volatile int waitStatus;
// 因为node需要构建成 fifo队列, 所以 prev 指向前继节点
volatile Node prev;
// 因为node需要构建成 fifo队列, 所以 next 指向后继节点
volatile Node next;
// 当前线程
volatile Thread thread;
// 头结点 任何时候,头结点对应的线程都是当前持锁线程
private transient volatile Node head;
//阻塞队列尾结点,
private transient volatile Node tail;
// 表示资源
// 独占锁模式:0 未加锁状态 >0 表示已经加过锁状态
private volatile int state;
// 独占模式下:表示当前持有锁的线程
private transient Thread exclusiveOwnerThread;