ReentrantLock详解-1(初识AQS)

25 阅读1分钟

我们随便在网上搜索一下"什么是AQS",一般结果如下图:

image.png

image.png

说实话,查出这么一大堆东西出来,我想应该会直接选择关闭网页的同学应该不占少数吧(我就是其中一个😭)。主要就是因为太多弯弯绕绕的官方词了,完全影响我们对技术的了解。

那么接下来我就用最直白的大白话来说说,AQS到底是什么玩意!

AQS全称AbstractQueuedSynchronizer(抽象队列同步器),这里为了方便理解,我直接上图

image.png

  1. ReentractLock内部有一个Sync类,实现了AQS抽象类
  2. 当线程1要使用ReentrantLock进行上锁时,会判断state是否等于0,如果是0则表示当前ReentrantLock没有上锁,则将state从0改成1,并且记录下当前上锁线程为线程1。
  3. 当线程2要上锁时,还是先判断state是否等于0,但此时state已经变成了1所以当前ReentrantLock已经被其他线程占用。AQS之所以称为AbstractQueuedSynchronizer,其中的Queued就是说明他里面维护了一个队列,那么由于队列又是基于链表实现的所以AQS里面也就可以说是维护了一个链表。
  4. 由于线程1已经占用锁,线程2会进入AQS里的一个队列进行排队,并将线程2挂起。
  5. 当线程1要释放锁时会将state改成0并且唤醒排队阻塞的线程2.
  6. 线程2被唤醒会将state改成1,当前操作线程标记为线程2。

这就是AQS的基本加锁释放锁的流程了,后续关于ReentrantLock的细节会慢慢更新!