AQS?
- AQS的全称:AbstractQueuedSynchronizer,抽象队列同步器
- java并发包下很多API都是基于AQS来实现的加锁和释放锁等功能的,AQS是java并发包的基础类。ReentrantLock、ReentrantReadWriteLock底层都是基于AQS来实现的。
- 看一下ReentrantLock和AQS之间的关系
ReentrantLock内部包含了一个AQS对象,也就是AbstractQueuedSynchronizer类型的对象。这个AQS对象就是ReentrantLock可以实现加锁和释放锁的关键性的核心组件。

ReentrantLock加锁和释放锁的底层原理
- 如果有一个线程过来尝试用ReentrantLock的lock()方法进行加锁,这个AQS对象内部有一个核心的变量叫做state,是int类型的,代表了加锁的状态。初始状态下,这个state的值是0。
- 另外,这个AQS内部还有一个关键变量,用来记录当前加锁的是哪个线程,初始化状态下,这个变量是null。

- 接着线程1跑过来调用ReentrantLock的lock()方法尝试进行加锁,这个加锁的过程,直接就是用CAS操作将state值从0变为1。如果之前没人加过锁,那么state的值肯定是0,此时线程1就可以加锁成功。一旦线程1加锁成功了之后,就可以设置当前加锁线程是自己。所以大家看下面的图,就是线程1跑过来加锁的一个过程。

本文深入解析了AQS(AbstractQueuedSynchronizer)的工作原理及其在ReentrantLock中的应用。详细介绍了AQS中state变量的作用,以及线程加锁、解锁、重入和互斥的实现机制。
最低0.47元/天 解锁文章
170万+





