线程安全(六)AQS 的工作原理

目录

    • 一、AQS 概述
      • 1.1 什么是 AQS?
      • 1.2 AQS 与 synchronized 区别:
      • 1.3 AQS 常见的实现类:
    • 二、AQS 的工作原理
      • 2.1 state 的用途:
      • 2.2 AQS 双向链表:
      • 2.3 ConditionObject 双向队列:
      • 2.4 总结:画图说明
    • 三、AQS 资源同步
      • 3.1 AQS 资源同步方式
      • 3.2 自定义同步器
      • 3.3 常见同步工具类
        • 1)Semephore 信号量
        • 2)CountDownLatch 计数器
        • 3)CyclicBarrier 循环栅栏

一、AQS 概述

1.1 什么是 AQS?

  • AQS 就是 AbstractQueuedSynchronizer 抽象类 的简称,它其实就是 JUC 包下的一个基类。
  • JUC 下的很多内容都是基于 AQS 实现了部分功能,比如:ReentrantLockThreadPoolExecutor阻塞队列CountDownLatchSemaphoreCyclicBarrier 等等都是基于 AQS 实现的。

1.2 AQS 与 synchronized 区别:

synchronizedAQS
关键字,C++ 语言实现Java 语言实现
悲观锁,自动释放锁悲观锁,手动开启和关闭锁
锁竞争激烈,都是重量级锁,性能差锁竞争激烈的情况下,提供了多种解决方案

1.3 AQS 常见的实现类:

  • ReentrantLock:阻塞式锁
  • Semaphore:信号量
  • CountDownLatch:计数器
  • CyclicBarrier:循环屏障

二、AQS 的工作原理

首先 AQS 中提供了一个由 volatile 修饰,并且采用 CAS 方式修改的 int 类型的 state 变量。

2.1 state 的用途:

  • ReentrantLock 中,使用 state 属性来标记当前互斥锁是否有线程持有,如果没有线程持有的话 state 就是 0,如果有线程持有的话 state 是大于 0 的。
  • ThreadPoolExecutor 中,worker 工作线程也是基于 state 变量来实现了一个锁的概念。
  • CountDownLatch 中,将 state 变量作为一个计数器,CountDownLatch 会在构建时声明好总数是多少。这个总数会直接赋值给 state,每次执行 countDown() 方法的时候,就会对 state 执行 -1 的操作。
  • Semaphore 中,也是基于 state 变量去记录现在有多少个资源,每个线程想要拿资源去操作时,也是对 state 进行 -1 的操作;当归还资源时,再执行 +1 操作。

由此可以看出,这个 state 变量是非常非常核心的一个属性。只要是用到了 AQS 基本上都用到了 state 属性。

2.2 AQS 双向链表:

除了 state 变量,AQS 中维护了一个 双向链表,有 head,有 tail,并且每个节点都是 Node 对象。

Node 源码如下所示:

static final class Node {// 表示线程以共享的模式等待锁static final Node SHARED = new Node();// 表示线程以独占的模式等待锁static final Node EXCLUSIVE = null;// 状态声明// 为0,表示当一个Node被初始化的时候的默认值// 为1,表示线程获取锁的请求已经取消了static final int CANCELLED =  1;// 为-1,表示线程已经准备好了,就等资源释放了static final int SIGNAL    = -1;// 为-2,表示节点在等待队列中,节点线程等待唤醒static final int CONDITION = -2;// 为-3,当前线程处在SHARED情况下,该字段才会使用(解决jdk1.5中的一个Bug)s

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/872061.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

顶顶通呼叫中心中间件-被叫路由、目的地绑定(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-被叫路由、目的地绑定(mod_cti基于FreeSWITCH) 1、配置分机 点击分机 -> 找到你需要设置的分机 ->呼叫路由设置为external 2、配置拨号方案 点击拨号方案 -> 输入目的地绑定 -> 点击添加 -> 点击brother conditi ->根据图中配置 co…

【实战系列】PostgreSQL 专栏,基于 PostgreSQL 16 版本

我的 PostgreSQL 专栏介绍及进度 20240715:目前整体进度已完成 85%,完成 16 万字,还有近 5 万字就截稿了。 (venv312) ➜ mypostgres git:(dev) sh scripts/word_statistics_pg_style.sh Filename …

无人机航电系统技术详解

一、系统概述 无人机航电系统(Avionics System)是无人机飞行与任务执行的核心部分,它集成了飞控系统、传感器、导航设备、通信设备等,为无人机提供了必要的飞行控制和任务执行能力。航电系统的设计和性能直接影响到无人机的安全性…

【JVM基础03】——组成-详细介绍下Java中的堆

目录 1- 引言:堆1-1 堆是什么?(What)1-2 为什么用堆?堆的作用 (Why) 2- ⭐核心:堆的原理(How)2-1 堆的划分2-2 Java 7 与 Java 8 的堆区别 3- 小结:3-1 详细介绍下Java的堆?3-2 JVM …

基于springboot与vue的旅游推荐系统与门票售卖

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

iPhone数据恢复:如何从iPhone恢复误删除的短信

来自iPhone的意外删除的短信可能很关键。它们可能是来自您常用应用程序、银行交易、付款收据的重要通知,也可能是来自朋友的重要文本、孩子的学校通知等。 如果您也从iPhone丢失了此类消息,我们在这里分享如何在没有备份以及有备份的情况下在iPhone上恢…

SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者

SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者 文章目录 目录 前言 一、启动SQL server服务的三种方法 1.不启动SQL server服务的影响 2.方法一:利用cmd启动SQL server服务 3.方法二:利用SQL Serv…

人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解

大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解。在机器学习和深度学习领域,模型的训练目标是找到一组参数,使得模型能够从训练数据中学习到有用的模式&am…

2023年高教杯数学建模2023B题解析(仅从代码角度出发)

前言 最近博主正在和队友准备九月的数学建模,在做往年的题目,博主主要是负责数据处理,运算以及可视化,这里分享一下自己部分的工作,相关题目以及下面所涉及的代码后续我会作为资源上传 问题求解 第一题 第一题的思路主要如下:…

【SpringBoot】SpringCache轻松启用Redis缓存

目录: 1.前言 2.常用注解 3.启用缓存 1.前言 Spring Cache是Spring提供的一种缓存抽象机制,旨在通过简化缓存操作来提高系统性能和响应速度。Spring Cache可以将方法的返回值缓存起来,当下次调用方法时如果从缓存中查询到了数据&#xf…

基于 jenkins 部署接口自动化测试项目!

引言 在现代软件开发过程中,自动化测试是保证代码质量的关键环节。通过自动化测试,可以快速发现和修复代码中的问题,从而提高开发效率和产品质量。而 Jenkins 作为一款开源的持续集成工具,可以帮助我们实现自动化测试的自动化部署…

自动化(二正)

Java接口自动化用到的技术栈 技术栈汇总: ①Java基础(封装、反射、泛型、jdbc) ②配置文件解析(properties) ③httpclient(发送http请求) ④fastjson、jsonpath处理数据的 ⑤testng自动化测试框架重点 ⑥allure测试报…

JMeter CSV 参数文件的使用教程

在 JMeter 测试过程中,合理地使用参数化技术是提高测试逼真度的关键步骤。本文将介绍如何通过 CSV 文件实现 JMeter 中的参数化。 设定 CSV 文件 首先,构建一个包含需要参数化数据的 CSV 文件。打开任何文本编辑器,输入希望模拟的用户数据&…

IGBT参数学习

IGBT(绝缘栅双极晶体管(Insulated Gate Bipolar Transistor))的内部架构如下所示: IGBT是个单向的器件,电流只能朝一个方向流动,通常IGBT会并联一个续流二极管 IGBT型号:IKW40N120T2 IKW40N120T2 电路符号…

【代码规范】.train(False)和.eval()的相似性和区别

【代码规范】.train(False)和.eval()的相似性和区别 文章目录 一、.train(False) 和 .eval() 的功能二、.train(False) 和 .eval() 的区别2.1 .eval()2.2 .train(False)2.3 总结 三、.eval()更加规范 一、.train(False) 和 .eval() 的功能 .train(False) 和 .eval() 在功能上非…

Centos7 安装Redis6.2.6 gcc报错问题解决

Redis 报错信息 make: *** [all] 错误 2 安装gcc 修改yum源,在安装更新rpm包时获得比较理想的速度,走阿里云镜像通道 发现报错信息如下: 正在解析主机 mirrors.aliyun.com (mirrors.aliyun.com)… 失败:未知的名称或服务。 wget: 无法解析主机地址 “mi…

数据中心内存RAS技术发展背景

随着数据量的爆炸性增长和云计算的普及,数据中心内存的多比特错误及由无法纠正错误(UE)导致的停机问题日益凸显,这些故障不仅影响服务质量,还会带来高昂的修复或更换成本。随着工作负载、硬件密度以及对高性能要求的增加,数据中心…

01--IptablesFirewalld详解

前言:这里写一下,前面文章里都是直接关闭然后实验,感觉这样有点草率,这里写一下大概的概念和用法,作为知识的补充,这章写轻松点,毕竟是网安毕业的,算是给自己放松一下吧。 1、iptabl…

RK3568笔记三十八:DS18B20驱动开发测试

若该文为原创文章,转载请注明原文出处。 DS18B20驱动参考的是讯为电子的单总线驱动第十四期 | 单总线_北京迅为的博客-CSDN博客 博客很详细,具体不描述。 只是记录测试下DS18B20读取温度。 一、介绍 流程基本和按键驱动差不多,主要功能是…

为什么要做USB转多路UART项目 - 技术角度

前言 之前专门为USB转多路UART项目写了个序,提到了技术方案原因,这个文章打算展开讲一下。 一、工业物联网关 最初是因为有个工业物联网关的项目,需要出多路RS485接口,每路外接几十个三相电表PLC之类的电力电子设备。其中一款需…