ReentrantLock关键组件分析
/**
* Creates an instance of {@code ReentrantLock}.
* This is equivalent to using {@code ReentrantLock(false)}.
*/
public ReentrantLock() {
sync = new NonfairSync();
}
默认的构造函数这里,创建了一个Sync,NonfairSync,是一个非常关键的组件,是底层专门用于加锁和释放锁的核心组件
public void lock() {
sync.lock();
}
ReentrantLock在进行加锁的时候,实际上是基于底层的sync调用lock方法进行加锁,ReentrantLock只不过是外面比较薄的一层。
public void lock() {
sync.lock();
}
sync:一个抽象的静态内部类,这个东西继承了AQS:AbstractQueuedSynchronizer。抽象队列同步器,是java并发包各种并发工具(锁、同步器)的底层的基础性的组件,核心的,主要是依赖于他。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2317535/1634830954405-1c789ace-b799-4cb7-8914-96ff9453f26c.png#clientId=u123cceb6-06d7-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=147&id=u2edb09ab&margin=%5Bobject%20Object%5D&name=image.png&originHeight=247&originWidth=977&originalType=binary&ratio=1&rotation=0&showTitle=false&size=29922&status=done&style=none&taskId=u896be895-9b4c-4f9a-b6c7-be820197924&title=&width=582.5)<br />可以看到下面AQS的uml类图,AQS里关键的一些东西,一个是Node(自定义数据结构,可以组成一个双向链表,也就是所谓的一个队列),state(核心变量,加锁、释放锁都是基于state来完成的)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/2317535/1634831475480-68934782-772f-42b0-9425-60c90c8ee7c0.png#clientId=u123cceb6-06d7-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=380&id=u8836e3cd&margin=%5Bobject%20Object%5D&name=image.png&originHeight=759&originWidth=1256&originalType=binary&ratio=1&rotation=0&showTitle=false&size=99399&status=done&style=none&taskId=u852685b2-9777-4acd-8aab-2565a9b0860&title=&width=628) <br />再来看下,ReentrantLock构造函数创建的sync是什么?<br />NonfairSync是Sync的一个子类,覆盖重写了几个方法,没什么特别的东西在里面,代表了一个Sync的具体实现
/**
* Sync object for non-fair locks
*/
static final class NonfairSync extends Sync {
private static final long serialVersionUID = 7316153563782823691L;
/**
* Performs lock. Try immediate barge, backing up to normal
* acquire on failure.
*/
final void lock() {
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
acquire(1);
}
protected final boolean tryAcquire(int acquires) {
return nonfairTryAcquire(acquires);
}
}