AQS同步队列和等待队列的同步机制

理解AQS必须要理解同步队列和等待队列之间的同步机制,简单来说流程是:
获取锁失败的线程进入同步队列,成功的占用锁,占锁线程调用await方法进入条件等待队列,其他占锁线程调用signal方法,条件等待队列线程进入同步队列排队。
举个例子:
去银行办理业务,需要排队、在窗口办理、费时间的有专员带你去小屋办理。三者之间的关系如下图:

  • 持有锁线程:相当于银行窗口一次只能一人坐那
  • 同步队列:相当于去银行拿了号在座位上排队
  • 条件等待队列:相当于复杂业务,经理把你从窗口叫走去小屋办理
    在这里插入图片描述
    这天你去银行办理业务(也就是要获取锁),只有一个窗口,如果你是第一个去的,则占用窗口办理即可。
    如果窗口有人,且排队人较多,你就先拿个号,排在队伍末尾依次等待叫号。
    在这里插入图片描述
    当下一个就轮到你时,窗口人走了,会叫你一声,这时候你就持有锁,在窗口位置占着。
    在这里插入图片描述
    办理过程中,专员发现你的业务过于费时间,且不需要你一直在窗口等着,阻塞了后面排队人的进度。这时专员会通知你,让你去等待区域等着(相当于调用了await方法)。你就进入了等待队列。
    在这里插入图片描述
    等你的业务处理完了,窗口的专员会通知你(signal方法),但排队区已经有人排队等了很长时间,这时候你要是直接插到窗口不合适,所以需要再次到到队伍末尾排队,即进入同步队列。再次等待依次叫号。
    上面通过一个简单的例子讲述了同步队列和条件等待队列的流转过程。下面从理论和代码层面看看如果理解。

1 同步队列和等待队列简述

AQS维护的队列是当前等待资源的队列,即获取锁失败的线程。当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成为一个节点并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。
在这里插入图片描述

每个Condition维护着一个队列,该队列的作用是维护一个等待singal信号的队列。
在这里插入图片描述

/AQS中的Node属性static final class Node {...volatile int waitStatus;//等待状态volatile Node prev;//前驱节点volatile Node next;//后驱节点volatile Thread thread;//获取同步状态的线程,当前执行线程Node nextWaiter;//等待队列中的后继节点...}

从上述Node结构可以看出,其实同步队列和等待队列使用的是同一个Node类型AbstractQueuedSynchronizer.Node。

2 同步队列和等待队列区别与协同机制

从简述中我们可知,同步队列和等待队列的作用是不同的。最重要的区别是:每个线程只能存在于同步队列或等待队列中的一个。

下面我们举一个具体的例子来说明同步队列和等待队列之间的区别与协同工作:

  1. 同步队列的初始状态为下图,同步队列中包含线程A(节点A)和线程B(节点B),线程调用reentrantLock.lock()时,线程被加入到AQS同步队列中
    在这里插入图片描述

  2. 线程A(节点A)调用condition.await()方法时,线程A(节点A)从AQS同步队列中被移除,对应操作是锁的释放; 线程A(节点A)接着被加入到Condition等待队列,因为线程需要singal信号。

  3. 线程B(节点B)由于线程A(节点A)释放锁被唤醒,判断成为同步队列头结点且同步状态为0可以获取锁;线程B(节点B)获取锁。
    在这里插入图片描述

  4. 线程B(节点B)调用singal()方法,Condition等待队列中有一个节点A,把它取出来加入到AQS同步队列中。这时候线程A(节点A)并没有被唤醒。
    在这里插入图片描述

  5. 线程B(节点B)singal方法执行完毕,调用reentrantLock.unLock()方法释放锁。线程A(节点A)成为AQS首节点并且同步状态可获取,线程A(节点A)被唤醒,继续执行。

  6. AQS从头到尾顺序唤醒线程,直到等待队列中的线程被执行完毕结束。

可以参考下原作者的文章,不要放过评论区部分的补充:http://ifeve.com/understand-condition/

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

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

相关文章

Python学习 -- datetime模块

当涉及到处理日期和时间数据时,Python的datetime模块提供了一系列类来帮助您执行各种操作。以下是各个类及其常用方法的详细介绍: date 类 date 类表示一个年、月、日的日期对象。以下是一些常用的 date 类方法: date.today()获取当前日期…

css自学框架之图片灯箱展示

实现的功能是页面中的图片单击,在灯箱中显示,单击按钮上下切换,单击灯箱退出展示,效果如下GIF展示。 实现步骤还是老样子,三方面工作一是CSS、二是JavaSxcript,三是HTML,下面开始一步一步实现&…

nginx使用详解

文章目录 一、前言二、nginx使用详解2.1、nginx特点2.2 静态文件处理2.3 反向代理2.4 负载均衡2.5 高级用法2.5.1 正则表达式匹配2.5.2 重定向 三、总结 一、前言 本文将详细介绍nginx的各个功能使用,主要包括 二、nginx使用详解 2.1、nginx特点 高性能&#xff…

Android 播放mp3文件

1,在res/raw中加入mp3文件 2,实现播放类 import android.content.Context; import android.media.AudioManager; import android.media.SoundPool; import android.util.Log;import java.util.HashMap; import java.util.Map;public class UtilSound {pu…

【Python】pytorch,CUDA是否可用,查看显卡显存剩余容量

CUDA可用,共有 1 个GPU设备可用。 当前使用的GPU设备索引:0 当前使用的GPU设备名称:NVIDIA T1000 GPU显存总量:4.00 GB 已使用的GPU显存:0.00 GB 剩余GPU显存:4.00 GB PyTorch版本:1.10.1cu102 …

包管理工具--》npm的配置及使用(二)

在阅读本篇文章前请先阅读包管理工具--》npm的配置及使用(一) 包管理工具系列文章目录 一、包管理工具--》npm的配置及使用(一) 二、包管理工具--》npm的配置及使用(二) 三、包管理工具--》发布一个自己…

解决Spring Boot启动错误的技术指南

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

Linux基础知识及常见指令

Linux简介及相关概念 什么是Linux? Linux是一个免费开源的操作系统内核,最初由Linus Torvalds于1991年创建。它是各种Linux发行版(通常称为“发行版”)的核心组件,这些发行版是完整的操作系统,包括Linux内…

Windows 点击任务栏图标没有反应

事情是这样的 我在 Windows 系统点击任务栏的虚拟机,点击没有反应。 怎么办啊 右键任务栏,选择任务管理器 找到对应的服务,鼠标右键,选择最大化。 就可以在屏幕显示了

R语言STAN贝叶斯线性回归模型分析气候变化影响北半球海冰范围和可视化检查模型收敛性...

原文链接:http://tecdat.cn/?p24334 像任何统计建模一样,贝叶斯建模可能需要为你的研究问题设计合适的模型,然后开发该模型,使其符合你的数据假设并运行(点击文末“阅读原文”获取完整代码数据)。 相关视频…

slog实战:文件日志、轮转与kafka集成

《slog正式版来了:Go日志记录新选择![1]》一文发布后,收到了很多读者的反馈,意见集中在以下几点: 基于slog如何将日志写入文件slog是否支持log轮转(rotation),如果slog不支持,是否有好的log轮转…

面试设计模式-责任链模式

一 责任链模式 1.1 概述 在进行请假申请,财务报销申请,需要走部门领导审批,技术总监审批,大领导审批等判断环节。存在请求方和接收方耦合性太强,代码会比较臃肿,不利于扩展和维护。 1.2 责任链模式 针对…

FasterNet(PConv)paper笔记(CVPR2023)

论文:Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks 先熟悉两个概念:FLOPS和FLOPs(s一个大写一个小写) FLOPS: FLoating point Operations Per Second的缩写,即每秒浮点运算次数,或…

ETLCloud制造业轻量级数据中台解决方案

制造业数据处理特点 制造业在业务发展过程中产生大量的业务交易数据以及设备运行过程中的状态数据,但是制造业有别于其他互联网或零售行业,其数据处理具有以下特点: 数据量不大,大部分业务系统的数据库表在1000W以下数据结构复杂…

小白参加红队,需要做好哪些准备?

在本文中,我们将为读者介绍要想加入红队,需要掌握哪些方面的技能。 CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方一个…

【广州华锐互动】元宇宙技术如何赋能传统工业企业?

随着科技的飞速发展,我们正处于工业革命4.0的时代,数字化、网络化和智能化正在深刻地改变着我们的生活和工作方式。在这个变革的大潮中,工业元宇宙平台应运而生,为企业带来了前所未有的机遇和挑战。 广州华锐互动开发的工业元宇宙…

咖啡店小程序:吸引顾客的创新营销手段

近日,“酱香拿铁”的大火让大家再次把目标聚焦在年轻人都喜欢的咖啡上。现在咖啡已经成为年轻一代的社交硬通货,咖啡店也遍地开花。而随着移动互联网的快速发展,咖啡店小程序已经成为了各大咖啡店主的选择,因为它提供了便捷的方式…

pytorch搭建squeezenet网络的整套工程,及其转tensorrt进行cuda加速

本来,前辈们用caffe搭建了一个squeezenet的工程,用起来也还行,但考虑到caffe的停更后续转trt应用在工程上时可能会有版本的问题所以搭建了一个pytorch版本的。 以下的环境搭建不再细说,主要就是pyorch,其余的需要什么p…

Gradle下载库速度过慢解决办法

最近搞了个Gradle的项目,项目下载依赖库太慢了,于是… Gradle下载库速度过慢的问题可能由多种原因导致,以下是一些可能的解决方案: 1、使用国内镜像站点: 你可以改变Gradle的配置,使用国内的镜像站点来下…

go开发之个人微信的开发

简要描述: 检测好友状态 请求URL: http://域名地址/checkZombie 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明…