首页 > 其他分享 >AQS (AbstractQueuedSynchronizer) 概述

AQS (AbstractQueuedSynchronizer) 概述

时间:2024-01-12 10:34:43浏览次数:34  
标签:AQS int AbstractQueuedSynchronizer 队列 boolean 线程 arg 概述

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

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 并发编程至关重要。

本文由博客一文多发平台 OpenWrite 发布!

标签:AQS,int,AbstractQueuedSynchronizer,队列,boolean,线程,arg,概述
From: https://blog.51cto.com/u_14799880/9211300

相关文章

  • 光端机技术概述:作用、优势与应用场景
    光端机技术概述:作用、优势与应用场景在当前的数字化时代,光通信技术发挥着不可或缺的作用。本文将围绕光端机技术进行深入探讨,包括其作用、优势和应用场景。光端机技术的作用光端机是实现光电信号转换的关键设备,起到连接不同网络和实现数据传输的桥梁作用。具体来说,光端机的作用主要......
  • 技术写作概述:内容分析、平台和转化追踪以及内容老化
    内容分析内容分析是一种技术作家用来解释和量化文本数据的研究方法。它涉及从不同来源的文本中编码和识别主题或模式的系统过程,这些来源包括书籍、博客、文章或其他文档类型。其主要目标是提供主观解释的、但有效且可重复的、从数据中得出的推论。这种技术有助于确定所讨论的内容......
  • Kafka Streams概述
    ApacheKafka是由Apache软件基金会开发的开源分布式流处理平台。最初是由LinkedIn团队开发,用于处理该公司产生的大量实时数据。Kafka的设计旨在处理大型数据流并提供实时数据处理能力。Kafka基于发布-订阅消息传递模型,生产者将消息发送到主题,消费者订阅这些主题以接收消息......
  • 【网络路由选择协议概述】
    (文章目录)前言路由选择协议是网络工程师用来设计和维护网络的基本工具,决定了数据如何在网络中传输,以及如何在多条路径中选择最佳路径。一、路由选择的重要性1.互联网的基础网络互连的核心:路由选择是实现不同网络设备之间互连的基础。没有有效的路由选择机制,互联网这个庞大......
  • HDMI光端机技术概述:高清多媒体传输的前沿
    在数字多媒体传输领域,HDMI光端机代表着高清传输技术的前沿。作为现代视听设备的标准接口,HDMI光端机在高清视频和音频传输方面的应用日益广泛,它不仅支持更高的分辨率和更丰富的色彩,还提供了更加稳定和高效的传输方式。技术特点高清晰度传输HDMI光端机支持从1080p到4K、8K甚至更高分......
  • Java之IO流概述
     1.1什么是IO生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了ctrl+s,可能文件就白白编辑了。当你电脑上插入一个U盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬盘、外接设备等等。我们把这种数据的传输,可以看做是一种数据的流动......
  • 【1.0】项目开发流程概述
    【一】项目开发流程公司中的项目流程几乎都可以分为以下五个步骤需求分析架构设计分组开发项目测试交付上线【二】项目需求分析【1】角色组成架构师+产品经理+开发者组长【2】任务产品经理带着开发部门的老大(架构师、研发经理),去客户公司寻找客户的需求......
  • openGauss学习笔记-177 openGauss 数据库运维-逻辑复制-逻辑解码-逻辑解码概述
    openGauss学习笔记-177openGauss数据库运维-逻辑复制-逻辑解码-逻辑解码概述177.1功能描述openGauss对数据复制能力的支持情况为:支持通过数据迁移工具定期向异构数据库(如Oracle等)进行数据同步,不具备实时数据复制能力。不足以支撑与异构数据库间并网运行实时数据同步的诉求。......
  • python学习笔记3(概述、开发工具、编写方法、print简单语法)
    上一节学习了环境准备、职业方向、执行方式三个方面学习本节内容:(一)概述1、了解python语言1989年荷兰人发明、面向对向、解释型设计哲学:优雅、明确、简单,“人生苦短,我用python”脱水语言,能够和其他语言编写的模块轻松联结,“脱水语言”2、版本发展历程发展历程比较简单,前两天我在网上......
  • 1、前言 2、概述
    1.0学习目标了解Git基本概念能够概述git工作流程能够使用Git常用命令熟悉Git代码托管服务能够使用VisualStudio/Rider/VSCode操作git1.1需要的知识储备linux基本命令编程入门基础简单的docker基础(会安装容器即可)1.2适合学习人群在......