概述

AQS:抽象队列同步器
实质上是并发包的基础组件,用来实现各种锁(ReentrantLock等),各种同步组件的。
包含了state,加锁线程,等待队列等并发中的核心组件。

ReentrantLock加锁和释放锁的底层原理

线程1执行加锁操作,其实会在AQS对象内部通过CAS操作修改state状态值,如果状态修改成功,说明加锁成功,此时,加锁线程就是线程1。
image.png image.png
ReentrantLock是可重入锁,意思就是可以对同一个ReentrantLock对象多次执行lock加锁操作和unlock解锁操作,也就是可以对一个锁加多次。每次的加锁,其实就是对AQS的state变量进行累加操作。

如果在线程1已经加锁成功后,此时线程2也过来尝试加锁,通过CAS操作,尝试将state从0变成1,尝试失败,且加锁线程不是空值,此时线程2就会加锁失败,然后将加锁失败的线程2放入等待队列。等待线程1释放锁,线程2就可以从队列中出来,并通过cas操作尝试再次对ReentrantLock加锁。
image.png

接着,如果线程1执行完业务代码,此时就会释放锁,释放锁就是把state做递减操作,如果此时state=0,就彻底释放锁,那对应的加锁线程就可以置为空值。
然后,线程2就会重新尝试加锁,同样用CAS操作,尝试将state从0置为1,此时cas成功,那线程2就加锁成功。,同时线程2也就从等待队列中出队了。
image.png