分析ReentrantLock独占锁的实现
ReentrantLock有三个静态内部类
构造函数
默认使用非公平锁
加锁的流程(非公平锁)
一、获取同步状态
以独占模式获取通过调用至少一次tryAcquire(int)实现,成功返回。否则线程排队,可能会重复阻塞和解除阻塞直到tryAcquire(int)获取成功。
调用非公平锁的tryAcquire方法的重写
二、加入队列
在获取同步状态失败的基础上,创建独占模式的节点,并添加到队列尾部
在队列加入节点成功后,接下来会调用acquireQueued(Node,int)方法自旋获取同步状态,前提是当前节点的prev节点是head节点才能获取同步状态。调用 tryAcquire(int)方法获取同步状态,如果成功获取到则将当前节点设置为head节点并将当前节点的prev设置为null。
如果前置节点不是head或获取同步状态失败则判断是否需要park
如果前置节点的状态是SIGNAL则需要park
ws>0表示该前置节点已经被取消
其他情况设置前置节点的状态为SIGNAL
检查是否中断
阻塞当前线程,然后返回线程的中断状态并复位中断状态
欢迎关注我的微信公众号,分享leetcode解题心得和Java后端的相关知识