【Java并发】什么是AQS?

文章目录

    • 什么是AQS?
    • AQS与Synchronized的区别
    • AQS-基本工作机制
    • AQS是公平锁与非公平锁

什么是AQS?

全称是 AbstractQueuedSynchronizer,即抽象队列同步器。它是构建锁或者其他同步组件的基础框架

所谓抽象,其实目的就是把具体的逻辑交给子类去实现,这样就可以实现不同的特性的锁:
例如:AQS常见的实现类
ReentrantLock 阻塞式锁
Semaphore 信号量
CountDownLatch 倒计时锁

AQS是多线程中的队列同步器。是一种锁机制,它是做为一个基础框架使用的,像ReentrantLockSemaphore都是基于AQS实现的.

AQS其实是一个抽象类,它实现了线程挂起的逻辑,实现了线程存储机制,实现了锁的状态逻辑,实现了线程唤醒的逻辑,却只定义了线程抢锁释放锁抽象,这样做的目的是将抢锁和释放锁的逻辑交给子类来实现,这样有助于实现各种不同特性的锁,比如共享锁,独占锁,公平锁非公平锁,可重入等。并且以模板方法模式将上述上锁流程和释放锁流程封装为固定模板方法。

所以AQS就是一个多线程访问共享资源的同步器框架。

AQS与Synchronized的区别

在这里插入图片描述
所以相比较Synchronized,基于AQS基础框架实现的各种特性不同的锁,对于解决多线程下锁的竞争可以提供不同的解决方案。

AQS-基本工作机制

AQS类自身有几个比较重要的属性:

```java
//正在持有锁的线程
private transient Thread exclusiveOwnerThread;
//等待队列的头节点
private transient volatile Node head;
//等待队列的尾节点
private transient volatile Node tail;
//锁标识字段
private volatile int state;

通过锁标识字段state来标志线程是否拥有锁
在这里插入图片描述
AQS-多个线程共同去抢这个资源是如何保证原子性的呢:
通过CAS操作(比较再交换)设置 state 状态,保证操作的原子性
在这里插入图片描述
当线程0和线程4同时去抢锁(修改state的值为1时)采用CAS的操作,使得线程0将state设为1,这时线程4再去修改state时不满足CAS操作的规则,这个时候不会自旋,而是直接加入(FIFO队列)等待队列。
在这里插入图片描述

AQS是公平锁与非公平锁

所谓公平不公平取决于:竞争的线程是队列的还是新的线程
新的线程队列中的线程共同来抢资源,是非公平锁
新的线程到队列中等待,只让队列中的head线程获取锁,是公平锁

公平锁:
在这里插入图片描述
在这里插入图片描述

当线程0释放锁的时候,让head指针指向的线程(线程1)去获取的锁执行自己的业务。
这就是公平锁

非公平锁:

在这里插入图片描述当线程0释放锁的时候,正好又有一个新的线程(线程5)进来了,那么如果线程5拿到了锁,队列中的head指针指向的线程没有拿到锁,
这就是非公平锁
在这里插入图片描述
公平锁和非公平锁各有优缺点,适用于不同的场景。公平锁的优点在于各个线程公平平等,每个线程等待一段时间后,都有执行的机会,而它的缺点相较于于非公平锁整体执行速度更慢,吞吐量更低。同步队列中除第一个线程以外的所有线程都会阻塞,CPU唤醒阻塞线程的开销比非公平锁大。

而非公平锁非公平锁的优点是可以减少唤起线程的开销,整体的吞吐效率高,因为线程有几率不阻塞直接获得锁,CPU不必唤醒所有线程。它的缺点呢也比较明显,即队列中等待的线程可能一直或者长时间获取不到锁。

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

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

相关文章

clion run qt 问题汇总

一、Error copying file “D:/soft/QT/5.15.2/mingw81_64/bin/Qt5Cored.dll” to “D:/work/Ccode/qtproject/cmake-build-debug-qtmingw”.报错 查看路径下确实没有Qt5Cored.dll,只有Qt5Core.dll 注释掉cmakelist中的这三行 重新执行后成功 二、使用CLion编辑u…

macbook有哪些好用的软件

最近有朋友留言说让小编推荐一些macbook必备应用软件,这不,macdown小编就精心整理了20多款有着不同用途的软件,自己用着还不错,现在分享给大家,整理不易,希望大家点赞收藏! 最近有朋友留言说让小…

数据结构链表——单链表

数据结构链表——单链表 概念及结构单链表的实现结构体类型的定义和头文件接口函数打印链表创建新节点尾插头插尾删头删查找任意插入指定位置之前插入指定位置之后插入 指定位置删除指定位置后删除单链表空间的销毁 概念及结构 概念:链表是一种物理存储结构上非连续…

MNIST数据集知识合集

MNIST数据集知识合集 认识MNIST数据集通过本地文件加载MNIST数据集torchvision.datasets加载MNIST数据集可视化(即转换成.jpg/.png之类的文件)疑惑—datasets.mnist和datasets.MNIST问题—downloadFalse运行报错 搭建CNN用于数字识别 认识MNIST数据集 M…

web前端之CSS

文章目录 一、CSS简介1.1 CSS语法规则 二、CSS的引用方法2.1 定义行内样式表2.2定义内部样式表2.3链入外部样式表2.4导入外部样式表 三、CSS选择符3.1 基本选择符3.1.1 标签选择符3.1.2 class类选择符3.1.3 id选择符 3.2 复合选择符3.2.1 交集选择符(合并选择器&…

Linux MQTT智能家居项目(智能家居界面布局)

文章目录 前言一、创建工程项目二、界面布局准备工作三、正式界面布局总结 前言 一、创建工程项目 1.选择工程名称和项目保存路径 2.选择QWidget 3.添加保存图片的资源文件: 在工程目录下添加Icon文件夹保存图片: 将文件放入目录中: …

AIGC 浪潮下,鹅厂新一代前端人的真实工作感受

点击链接了解详情 原创作者:张波 腾小云导读 AIGC 这一时代潮流已然不可阻挡,我们要做的不是慌乱,而是把握住这个时代的机会。本文就和大家一起来探索在 AIGC 下,前端工程师即将面临的挑战和机遇。聊聊从以前到现在,A…

浅谈AI浪潮下的视频大数据发展趋势与应用

视频大数据的发展趋势是多样化和个性化的。随着科技的不断进步,人们对于视频内容的需求也在不断变化。从传统的电视节目到现在的短视频、直播、VR等多种形式,视频内容已经不再是单一的娱乐方式,更是涉及到教育、医疗、商业等各个领域。 为了满…

云原生Kubernetes:阿里云托管k8s集群ACK创建和使用

目录 一、理论 1.容器服务Kubernetes版 2.ACK Pro版集群概述 3.ACK版本说明 二、实验 1.创建专有版Kubernetes集群 三、问题 1.依赖检查未通过 一、理论 1.容器服务Kubernetes版 (1)概念 阿里云容器服务Kubernetes版(Alibaba Cloud…

react-virtualized可视化区域渲染的使用

介绍 github地址:https://github.com/bvaughn/react-virtualized 实例网址:react-virtualized如果体积太大,可以参考用react-window。 使用 安装: yarn add react-virtualized。在项目入口文件index.js中导入样式文件&#xff…

进阶:Docker容器管理工具——Docker-Compose使用

文章目录 前言Compose大杀器编排服务 1、docker-compose安装curl方式安装增加可执行权限查看版本 2、Docker-compose.yaml命令3、 docker-compose实战4、Docker网络路由docker的跨主机网络路由**问题由来**:方案两台机分别配置路由表ip_forward配置 总结 前言 容器的管理工具&…

惊讶,日本用“Excel”作画,中国却用“Excel”造“另类”软件

精益求精 表格是一项伟大的创造,它的出现改变了人类记录、分析和展示数据的方式。 随着科技的日益月异的更新,从最早的纸质表格到现代化的电子表格,人类对表格的改造也在不断的升级和进步。 最初的纸质表格的简单记录,无法进行复…