AQS,即AbstractQueuedSynchronizer, 抽象队列同步器,它是Java并发用来构建锁和其他同步组件的基础框架。
AQS内部维护的变量.png
AQS内部有一个核心变量state,代表加锁的状态,被volatile关键字修饰,保证了线程间的可见性,默认情况下为0。还有一个核心变量是用来记录当前加锁的是哪一个线程,初始状态下,这个变量为null。
线程1跑过来调用ReetrantLock的lock方法进行加锁,这个加锁的过程,就是用CAS操作将state值从0变成1。如果之前没有人加过锁,那么state肯定为0,加锁就可以成功。加锁成功之后就会设置当前加锁线程是自己。
AQS加锁过程.png
ReetrantLock是一个可重入锁,每一次线程1可重入加锁一次,会判断一下当前加锁线程就是自己,那么他自己就可以可重入多次加锁,每次加锁就是把state变量累加1。
若此时线程2跑过来尝试加锁,会发生以下情况:
线程2加锁失败(CAS操作),会把自己放入一个等待队列,等待线程1释放锁,线程1会唤醒线程2,再重新尝试加锁。
AQS实现原理.png
网友评论