AQS基础理解
前言
Java中的大部分同步类(Lock、Semaphore、ReentrantLock等)都是基于 AbstractQueuedSynchronizer (简称为AQS)实现的,中文名:抽象队列同步器。
AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程功能以及队列模型的简单框架。
核心思想
- 如果被请求的共享资源空闲,那么就将当前请求资源的线程设置为有效的工作线程,将共享资源设置为锁定状态;
- 如果共享资源被占用,就需要一定的阻塞等待唤醒机制来保证锁分配。
- 这个机制主要用的是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 许可协议。转载请注明出处!
评论