AQS解析

AQS(AbstractQueuedSynchronizer)是Java并发包中的一个基础类,主要用于构建同步器和锁。以下是对AQS的详细解析:

一、AQS概述

  • 全称:AbstractQueuedSynchronizer
  • 作用:构建同步器和锁,是Java并发包(JUC)的基石。
  • 特点:通过内置的FIFO(First In, First Out,先进先出)队列来完成资源获取线程的排队工作,并通过一个int类型的变量表示持有锁的状态。

二、基本原理

  1. 状态标识(state)

    • AQS使用一个volatile int成员变量来表示同步状态,通过CAS(Compare-And-Swap)操作实现对其值的修改,以保证线程安全。
    • volatile保证了状态变量的可见性,即当一个线程修改了状态变量后,其他线程能够立即看到修改后的值。
  2. 队列机制

    • AQS内部维护了一个CLH队列的变体,即一个虚拟的双向队列,用于存储等待获取资源的线程。
    • 当资源被占用时,新的请求线程会被加入到队列的尾部,并挂起等待;当资源被释放时,队列中的线程会按照先进先出的顺序被唤醒并尝试获取资源。
  3. 独占与共享

    • AQS支持两种资源的占有方式:独占式和共享式。
    • 独占式:资源只能被一个线程独占,如ReentrantLock。
    • 共享式:资源可以被多个线程同时占有,如Semaphore、CountDownLatch。

三、核心方法

AQS提供了多种方法供子类重写,以应对不同的同步需求:

  1. 独占式方法

    • tryAcquire(int arg):尝试以独占方式获取资源,成功则返回true,失败则返回false。
    • tryRelease(int arg):尝试以独占方式释放资源,成功则返回true,失败则返回false。
    • isHeldExclusively():判断当前线程是否以独占方式持有锁。
  2. 共享式方法

    • tryAcquireShared(int arg):尝试以共享方式获取资源,返回值大于等于0表示成功,否则表示失败。
    • tryReleaseShared(int arg):尝试以共享方式释放资源,成功则返回true,失败则返回false。

四、应用实例

以ReentrantLock为例,其内部通过继承AQS并重写相关方法来实现锁的功能:

  1. 加锁

    • 当线程尝试加锁时,会调用AQS的acquire方法,该方法会先尝试通过tryAcquire方法获取锁。
    • 如果获取成功,则直接返回;如果失败,则将当前线程加入到等待队列中,并挂起等待。
  2. 解锁

    • 当线程执行完临界区代码后,会调用AQS的release方法释放锁。
    • release方法会调用tryRelease方法释放资源,并唤醒等待队列中的下一个线程。

五、总结

AQS是Java并发包中的一个核心类,通过维护一个状态变量和一个等待队列,实现了对同步资源的获取和释放。它支持独占式和共享式两种资源占有方式,并提供了多种方法供子类重写,以满足不同的同步需求。在Java并发编程中,AQS被广泛应用于构建各种同步器和锁,是并发编程的基石之一。

相关推荐
你不是我我6 小时前
【Java 开发日记】HTTP3 性能更好,为什么内网微服务依然多用 HTTP2?HTTP2 内网优势是什么?
java·开发语言·微服务
雪碧聊技术6 小时前
大模型爆火!Java后端如何抓住Agent全栈开发的风口
java·大模型·agent·全栈开发
逻辑驱动的ken7 小时前
Java高频面试场景题25
java·开发语言·深度学习·面试·职场和发展
AI人工智能+电脑小能手8 小时前
【大白话说Java面试题】【Java基础篇】第32题:Java的异常处理机制是什么
java·开发语言·后端·面试
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ9 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
無限進步D10 小时前
Java 面向对象高级 接口
java·开发语言
逸Y 仙X11 小时前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
二哈赛车手11 小时前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
AC赳赳老秦11 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw