AQS与ReentrantLock实现

一、特点
1.公平与非公平:和请求顺序关联,有顺序为公平锁,反之为非公平锁(默认)
2.可重入:lock+unlock一致次数
3.可中断:lockInterruptibly
4.尝试非阻塞超时获取锁:trylock
5.等待唤醒机制的多个条件变量:condition
二、实现
Constructor(bool is_fair) NoneFairSync和FairSync,两者 是内部类继承自抽象类Sync,
Sync继承自AbstractQueuedSynchronizer 抽象队列同步器,
AQS继承实现原理可以参考:https://blog.csdn.net/javazejian/article/details/75043422。
AbstractQueuedSynchronizer又称为队列同步器(后面简称AQS),它是用来构建锁或其他同步组件的基础框架,内部通过一个int类型的成员变量state来控制同步状态,当state=0时,则说明没有任何线程占有共享资源的锁,当state=1时,则说明有线程目前正在使用共享变量,其他线程必须加入同步队列进行等待,AQS内部通过内部类Node构成FIFO的同步队列来完成线程获取锁的排队工作,同时利用内部类ConditionObject构建等待队列,当Condition调用wait()方法后,线程将会加入等待队列中,而当Condition调用signal()方法后,线程将从等待队列转移动同步队列中进行锁竞争。注意这里涉及到两种队列,一种的同步队列,当线程请求锁而等待的后将加入同步队列等待,而另一种则是等待队列(可有多个),通过Condition调用await()方法释放锁后,将加入等待队列。关于Condition的等待队列我们后面再分析,这里我们先来看看AQS中的同步队列模型

AQS与ReentrantLock实现_第1张图片
image.png

AQS与ReentrantLock实现_第2张图片
image.png

原理:关于独占模式的加锁和释放锁的过程到这就分析完,总之呢,在AQS同步器中维护着一个同步队列,当线程获取同步状态失败后,将会被封装成Node结点,加入到同步队列中并进行自旋操作,当当前线程结点的前驱结点为head时,将尝试获取同步状态,获取成功将自己设置为head结点。在释放同步状态时,则通过调用子类(ReetrantLock中的Sync内部类)的tryRelease(int releases)方法释放同步状态,释放成功则唤醒后继结点的线程。

你可能感兴趣的:(AQS与ReentrantLock实现)