图解AQS原理之ReentrantLock详解-非公平锁

并发编程中,ReentrantLock的使用是比较多的,包括之前讲的LinkedBlockingQueue和ArrayBlockQueue的内部都是使用的ReentrantLock,谈到它又不能的不说AQS,AQS的全称是AbstractQueuedSynchronizer,这个类也是在java.util.concurrent.locks下面,提供了一个FIFO的队列,可以用于构建锁的基础框架,内部通过原子变量state来表示锁的状态,当state大于0的时候表示锁被占用,如果state等于0时表示没有占用锁,ReentrantLock是一个重入锁,表现在state上,如果持有锁的线程重复获取锁时,它会将state状态进行递增,也就是获得一个信号量,当释放锁时,同时也是释放了信号量,信号量跟随减少,如果上一个线程还没有完成任务,则会进行入队等待操作。

本文分析内容主要是针对jdk1.8版本

约束:文中图片的ref-xxx代表引用地址

图片中的内容prve更正为prev,由于文章不是一天写的所以有些图片更正了有些没有。

AQS主要字段 /** * 头节点指针,通过setHead进行修改 */ private transient volatile Node head; /** * 队列的尾指针 */ private transient volatile Node tail; /** * 同步器状态 */ private volatile int state; AQS需要子类实现的方法

AQS是提供了并发的框架,它内部提供一种机制,它是基于模板方法的实现,整个类中没有任何一个abstract的抽象方法,取而代之的是,需要子类去实现的那些方法通过一个方法体抛出UnsupportedOperationException异常来让子类知道,告知如果没有实现模板的方法,则直接抛出异常。

方法名 方法描述
tryAcquire   以独占模式尝试获取锁,独占模式下调用acquire,尝试去设置state的值,如果设置成功则返回,如果设置失败则将当前线程加入到等待队列,直到其他线程唤醒  
tryRelease   尝试独占模式下释放状态  
tryAcquireShared   尝试在共享模式获得锁,共享模式下调用acquire,尝试去设置state的值,如果设置成功则返回,如果设置失败则将当前线程加入到等待队列,直到其他线程唤醒  
tryReleaseShared   尝试共享模式下释放状态  
isHeldExclusively   是否是独占模式,表示是否被当前线程占用  

AQS是基于FIFO队列实现的,那么队列的Node节点又是存放的什么呢?

Node字段信息 字段名 类型 默认值 描述
SHARED   Node   new Node()   一个标识,指示节点使用共享模式等待  
EXCLUSIVE   Nodel   Null   一个标识,指示节点使用独占模式等待  
CANCELLED   int   1   节点因超时或被中断而取消时设置状态为取消状态  
SIGNAL   int   -1   当前节点的后节点被park,当前节点释放时,必须调用unpark通知后面节点,当后面节点竞争时,会将前面节点更新为SIGNAL  
CONDITION   int   -2   标识当前节点已经处于等待中,通过条件进行等待的状态  
PROPAGATE   int   -3   共享模式下释放节点时设置的状态,被标记为当前状态是表示无限传播下去  
0   int     不属于上面的任何一种状态  
waitStatus   int   0   等待状态,默认初始化为0,表示正常同步等待,  
pre   Node   Null   队列中上一个节点  
next   Node   Null   队列中下一个节点  
thread   Thread   Null   当前Node操作的线程  
nextWaiter   Node   Null   指向下一个处于阻塞的节点  

通过上面的内容我们可以看到waitStatus其实是有5个状态的,虽然这里面0并不是什么字段,但是他是waitStatus状态的一种,表示不是任何一种类型的字段,上面也讲解了关于AQS中子类实现的方法,AQS提供了独占模式和共享模式两种,但是ReentrantLock实现的是独占模式的方式,下面来通过源码的方式解析ReentrantLock。

ReentrantLock源码分析

首先在源码分析之前我们先来看一下ReentrantLock的类的继承关系,如下图所示:

图解AQS原理之ReentrantLock详解-非公平锁

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyffxz.html