Reentlock主要利用CAS+AQS实现,支持公平性锁和非公平性锁
AQS使用一个先进先出的队列表示排队等待锁的线程,同时每个节点
维护一个等待状态waitStatus
基本实现原理:
当一个线程试图获取锁的时候,先通过CAS进行判断当前能否获取锁,如果不能获取锁,就进入等待队列并被挂起,当要获取的锁被释放之后,再次通过CAS尝试获取锁,此时会有两种情况,一种是公平性锁,一种是非公平性锁
公平性锁:按照在等待队列中的顺序获取锁,如果自己当前不是队首的线程,就排到队尾,由队首线程获取锁
非公平锁:无论自己是否处于队首,都会尝试获取锁,不顾及等待队列中的其他线程
非公平性锁源码实现
final boolean nonfairTryAcquire(int acquires) {
//获取当前线程
final Thread current = Thread.currentThread();
//获取state变量
int c = getState();
if (c == 0) {
//如果当前state为0,说明没有线程占用锁,
//不考虑自己是不是第一个线程,直接尝试占用锁
if (compareAndSetState(0, acquires)) {
setExclusiveOwnerThread(current);