AbstractQueuedSynchronizer(二)

192 阅读1分钟

分析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后端的相关知识