AQS基础理解
SunRan

前言

Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于 AbstractQueuedSynchronizer (简称为AQS)实现的,中文名:抽象队列同步器

AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。

核心思想

  1. 如果被请求的共享资源空闲,那么就将当前请求资源的线程设置为有效的工作线程,将共享资源设置为锁定状态;
  2. 如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。
  3. 这个机制主要用的是CLH队列的变体实现的,将暂时获取不到锁的线程加入到队列中。
  • CLH:Craig、Landin and Hagersten队列,是单向链表,AQS中的队列是CLH变体的虚拟双向队列(FIFO),AQS是通过将每条请求共享资源的线程封装成一个节点来实现锁的分配。
  • AQS使用一个 Volatile 的 int 类型的成员变量来表示同步状态,通过内置的FIFO队列来完成资源获取的排队工作,通过CAS完成对State值的修改。

当第一个线程进来查询 state 的状态,如果 state = 0 则获取锁,如果 大于 0 则表示已经被获取,需要进入CLH队列等待。

所以AQS的本质是

  • 一个Volatile 修饰 int 类型的 State
  • CAS
  • 双向链表

关于性能

AQS通过CAS操作代替了 synchronized 的重量级锁,性能得到了提升,但是在JDk1.5之后 synchronized带来了锁升级的机制,二者性能上差距已经不大,针对不同的场景进行不同的选型

  • 本文标题:AQS基础理解
  • 本文作者:SunRan
  • 创建时间:2022-01-06 15:46:04
  • 本文链接:https://lksun.cn/2022/01/06/AQS基础理解/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论