AQS (AbstractQueuedSynchronizer) 概述

简介: AQS (AbstractQueuedSynchronizer) 概述

AQS (AbstractQueuedSynchronizer) 概述

AQS,即 AbstractQueuedSynchronizer,是Java并发包中的一个核心组件,它为实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关的同步器(如信号量、事件等)提供了一个框架。

核心概念

AQS 使用一个整型的 volatile 变量(称为 state)来表示同步状态,并通过内置的 FIFO 队列来管理那些阻塞在同步状态上的线程。

状态(State)

AQS 中的 state 变量是用来表示同步状态的。例如,在一个独占锁的实现中,state 可能表示锁的占用情况(0 表示未锁定,1 表示锁定)。

节点(Node)和队列

当线程尝试获取同步状态失败时,AQS 会将该线程包装成一个节点(Node)并将其加入到队列中。这个队列是一个双向链表,用于实现等待队列。

AQS 的主要方法

AQS 定义了一系列的方法,这些方法可以被同步器实现以提供其独特的同步逻辑。

独占模式

  • boolean tryAcquire(int arg):尝试获取资源,成功则返回 true,失败则返回 false
  • boolean tryRelease(int arg):尝试释放资源,成功则返回 true,失败则返回 false

共享模式

  • int tryAcquireShared(int arg):尝试获取资源。返回值大于等于0表示成功;小于0表示失败。
  • boolean tryReleaseShared(int arg):尝试释放资源,成功则返回 true,失败则返回 false

模板方法

  • void acquire(int arg):调用 tryAcquire,并在失败时将线程加入队列,可能会阻塞。
  • void release(int arg):调用 tryRelease 并唤醒等待中的线程。
  • void acquireShared(int arg):调用 tryAcquireShared,并在失败时将线程加入队列,可能会阻塞。
  • void releaseShared(int arg):调用 tryReleaseShared 并唤醒等待中的线程。

AQS 的重要性

AQS 的设计极大地简化了同步控制的实现,许多并发工具类都是基于 AQS 构建的,例如:

  • ReentrantLock:一个可重入的互斥锁。
  • CountDownLatch:一个允许一个或多个线程等待一系列指定操作的完成。
  • Semaphore:一个计数信号量。
  • FutureTask:一个可取消的异步计算。

AQS 的使用示例

以下是一个简化的 AQS 使用示例,展示了如何实现一个独占锁:

class Mutex extends AbstractQueuedSynchronizer {
    // 尝试获取锁
    protected boolean tryAcquire(int acquires) {
        assert acquires == 1; // Otherwise unused
        if (compareAndSetState(0, 1)) {
            setExclusiveOwnerThread(Thread.currentThread());
            return true;
        }
        return false;
    }
    // 尝试释放锁
    protected boolean tryRelease(int releases) {
        assert releases == 1; // Otherwise unused
        if (getState() == 0) throw new IllegalMonitorStateException();
        setExclusiveOwnerThread(null);
        setState(0);
        return true;
    }
    // 是否锁定状态
    public boolean isLocked() {
        return getState() != 0;
    }
}

在这个示例中,tryAcquire 方法检查 state 是否为0,如果是,则尝试将其设置为1,如果设置成功,则表示获取了锁。tryRelease 方法将 state 设置回0,并清除独占线程。

AQS 提供的模板方法 acquirerelease 会调用这些方法,并在必要时进行线程的排队和唤醒。

总结

AQS 是 Java 并发编程中的一个重要组件,它通过内部的同步状态、等待队列和模板方法,为构建锁和其他同步器提供了强大的基础。理解和掌握 AQS 对于深入学习 Java 并发编程至关重要。

相关文章
|
消息中间件 Java API
RocketMQ事务消息, 图文、源码学习探究~
介绍 RocketMQ是阿里巴巴开源的分布式消息中间件,它是一个高性能、低延迟、可靠的消息队列系统,用于在分布式系统中进行异步通信。 从4.3.0版本开始正式支持分布式事务消息~ RocketMq事务消息支持最终一致性:在普通消息基础上,支持二阶段的提交能力。将二阶段提交和本地事务绑定,实现全局提交结果的一致性。 原理、流程 本质上RocketMq的事务能力是基于二阶段提交来实现的 在消息发送上,将二阶段提交与本地事务绑定 本地事务执行成功,则事务消息成功,可以交由Consumer消费 本地事务执行失败,则事务消息失败,Consumer无法消费 但是,RocketMq只能保证本地事务
|
2月前
|
消息中间件 存储 人工智能
Apache RocketMQ for AI 战略升级,开启 AI MQ 新时代
Apache RocketMQ 顺应AIGC浪潮,针对长时会话、稀缺算力调度及AI Agent协作等挑战,推出专为AI时代打造的消息引擎。通过“会话即主题”的Lite-Topic机制,实现百万级队列动态管理,保障会话连续性与断点续传;结合智能资源调度能力,如定速消费与优先级队列,提升算力利用率与服务公平性;同时构建高效异步通信枢纽,支撑Agent-to-Agent及AI工作流的非阻塞协同。已在阿里集团与阿里云多个AI产品中大规模验证,助力开发者构建稳定、高效、可扩展的AI应用基础设施。
|
7月前
|
人工智能 分布式计算 监控
AgentSociety:告别纸上谈兵!AI社会模拟器预判政策漏洞:输入新规秒看30年后社会形态
AgentSociety 是清华大学推出的基于大语言模型的社会模拟器,通过构建类人心智的智能体模拟复杂社会行为,适用于政策沙盒测试、危机预警等场景。
296 6
|
存储 缓存 算法
JVM第三讲:深入理解java虚拟机之垃圾回收算法?CMS垃圾回收的基本流程?对象引用类型?
JVM第三讲:深入理解java虚拟机之垃圾回收算法?CMS垃圾回收的基本流程?对象引用类型?
426 0
|
3月前
|
存储 Java Linux
详细地说一说零拷贝
我是小假 期待与你的下一次相遇 ~
156 1
详细地说一说零拷贝
|
5月前
|
Java Linux
CentOS环境搭建Elasticsearch集群
至此,您已成功在CentOS环境下搭建了Elasticsearch集群。通过以上介绍和步骤,相信您对部署Elasticsearch集群有了充分的了解。最后祝您在使用Elasticsearch集群的过程中顺利开展工作!
283 22
|
IDE 测试技术 持续交付
Python自动化测试与单元测试框架:提升代码质量与效率
【9月更文挑战第3天】随着软件行业的迅速发展,代码质量和开发效率变得至关重要。本文探讨了Python在自动化及单元测试中的应用,介绍了Selenium、Appium、pytest等自动化测试框架,以及Python标准库中的unittest单元测试框架。通过详细阐述各框架的特点与使用方法,本文旨在帮助开发者掌握编写高效测试用例的技巧,提升代码质量与开发效率。同时,文章还提出了制定测试计划、持续集成与测试等实践建议,助力项目成功。
197 5
|
9月前
|
存储 NoSQL Redis
redis主从集群与分片集群的区别
主从集群通过主节点处理写操作并向从节点广播读操作,从节点处理读操作并复制主节点数据,优点在于提高读取性能、数据冗余及故障转移。分片集群则将数据分散存储于多节点,根据规则路由请求,优势在于横向扩展能力强,提升读写性能与存储容量,增强系统可用性和容错性。主从适用于简单场景,分片适合大规模高性能需求。
329 5
|
9月前
|
Ubuntu Linux 网络安全
mobaxterm x11 转发Ubuntu mac
通过上述步骤,您可以成功在 macOS 上使用 MobaXterm 实现对 Ubuntu 服务器的 X11 转发。确保每一步操作准确无误,可以有效避免常见的配置问题。通过这种方式,可以在 macOS 上方便地运行和调试远程 Ubuntu 服务器上的图形界面应用程序。
758 5
|
12月前
|
消息中间件 Kafka Go
使用github.com/IBM/sarama 编写消费kafka的功能
使用github.com/IBM/sarama 编写消费kafka的功能

热门文章

最新文章