AQS的ReentrantLock源码
什么是AQS(全称AbstractQueuedSynchronizer)
代表:重入锁、独占锁/共享锁、公平锁/非公平锁
是JUC包中线程阻塞、阻塞队列、唤醒、尝试获取锁的一个框架
AbstractQueuedSynchronizer是全称,是一个模板模式,一些线程同步公共的抽象类,里面有同步线程的类公共行为,比如:阻塞队列、加锁
AQS主要思想
尝试获取锁,如果获取失败就加入阻塞队列,如果有条件就先加入条件队列(如:ReentrantLock的创建多个newCondition()),条件队列中线程达到某个条件就会加入到阻塞队列,阻塞队列中的线程一直尝试获取锁。

ReentrantLock lock = new ReentrantLock(); 其中有个参数是否为公平锁
加锁
1. 判断参数是否为true 如果为true那么参数Syn就是FairSync,如果为false或者空代表非公平锁 Syn就是NonfairSync

2. 使用lock.lock();
公平锁:直接加入等待队列

非公平锁:尝试获取锁,如果获取到了那么就改变锁状态为1代表已经有线程持有锁了并且将当前线程复制给exclusiveOwnerThread参数留作后面判断是否为当前线程,如果当前线程就可以冲入直接返回true拿到锁,如果获取锁失败了就加入等待队列,加入等待队列时还会再次获取一次锁,如果还是失败了就会彻底加入等待队列

3. 加入等待队列
加入阻塞队列时再次尝试获取锁

队列使用的是链表,将当前Node节点加入到链表后面,如果是第一次加入到链表中就会创建头节点,头节点代表的就是已经获取到锁的那个线程,Thread参数为null,当前线程的Node节点在这个节点的后面并且Thread为当前线程。
如果第一次加入阻塞队列,初始化队列,下边这个代码相当于是自旋锁循环设置头节点

设置当前ReentrantLock的wait状态为-1。

加入队列以后设置指定当前线程 阻塞使用 LockSupport.park(this);
当前线程调用interrupted();方法优雅停止线程。

加锁完毕
释放锁
如果当前操作的线程不是加锁的线程就会抛出 IllegalMonitorStateException异常;
尝试改变当前锁的状态为0,如果成功就将当前操作线程改为0并且状态改为0

修改waitStauts并且指定出队的线程唤醒。

老师图片

相关文章:
AQS的ReentrantLock源码
什么是AQS(全称AbstractQueuedSynchronizer) 代表:重入锁、独占锁/共享锁、公平锁/非公平锁 是JUC包中线程阻塞、阻塞队列、唤醒、尝试获取锁的一个框架 AbstractQueuedSynchronizer是全称,是一个模板模式,一些线程…...
CSP-J 模拟题2
如果x大于45,则输出-1 设定一个整数now,他的初始值为9; 当x>now,就x-now,并且now--; 根据解析写代码1: #include <bits/stdc.h> using namespace std; int a[101010]; int main(){int x;cin>…...
途牛养车省养车平台源码 买卖新车租车二手车维修装潢共享O2O程序源码
源码采用FastAdmin框架开发,功能成熟完善,已有成功案例。 业务涵盖保险、二手车、接送、拖车、租车、保养、维修、入驻等连接线上等基础和深度服务。 采用的是“线上 车主直控社区加盟店” 模式,其主要考虑是布局门店有助于让目标消费用户…...
开发中遇到的gzuncompress,DomDocument等几个小问题以及一次Php上线碰到的502问题及php异常追踪
一、开发中遇到的gzuncompress,DomDocument等几个小问题记在此 1,昨天在命令行模式行运行一个很复杂的程序,一开始执行php,刚刚连接数据库,都没怎么查几条记录,(publish:October 27, 2017 -Fridayÿ…...
【Material-UI】Button 组件中的基本按钮详解
文章目录 一、基本按钮变体1. 文本按钮(Text Button)2. 实心按钮(Contained Button)3. 轮廓按钮(Outlined Button) 二、应用场景与注意事项1. 使用场景2. 注意事项 三、总结 Material-UI 的 Button 组件是前…...
人工智能自动驾驶三维车道线检测—PersFormer模型代码详解
文章目录 1. 背景介绍2. 数据加载和预处理3. 模型结构4. Loss计算5. 总结和讨论 1. 背景介绍 梳理了PersFormer 3D Lane这篇论文对应的开源代码。 2. 数据加载和预处理 数据组织方式参考:自动驾驶三维车道线检测系列—OpenLane数据集介绍。 坐标系参考ÿ…...
LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备成为可能(上篇)
🦜️ LangChain Streamlit🔥 Llama 🦙:将对话式人工智能引入您的本地设备🤯 将开源LLMs和LangChain集成以进行免费生成式问答(不需要API密钥) 在过去的几个月中,大型语言模型(LLMs)得…...
sql注入部分总结和复现
一个端口对应一个服务 联合查询注入 所有的程序中,单双引号必须成对出现 需要从这个引号里面逃出来 在后面查询内容 ?id1 要查库名,表名,列名。但是联合查询要知道有多少列,所以通过order by 去查询 order by # 通过二分法…...
开源企业级后台管理的快速启动引擎:Ballcat
Ballcat:快速搭建,高效管理,Ballcat让企业后台开发更简单。 - 精选真开源,释放新价值。 概览 Ballcat,一个专为企业级后台管理而设计的快速开发框架,以其高效的开发模式和全面的安全特性,为开发…...
FashionAI比赛-服饰属性标签识别比赛赛后总结(来自 Top14 Team)
关联比赛: FashionAI全球挑战赛—服饰属性标签识别 推荐大家看本篇博客之前,看一下数据集制作的方法,如何做一个实用的图像数据集 PS:我是参加完比赛之后才看的,看完之后,万马奔腾.....,因为发现比赛中还…...
C语言 | Leetcode C语言题解之第319题灯泡开关
题目: 题解: int bulbSwitch(int n) {return sqrt(n 0.5); }...
【第十届泰迪杯数据挖掘挑战赛A题害虫识别】-农田害虫检测识别-高精度完整更新
农田害虫检测识别项目-高精度完整版 一、说明: 该版本为基于泰迪杯完整害虫数据重新制作数据集、优化增强数据集、重新进行模型训练,达到高精度、高召回率的最优模型代码。包含论文、最优模型文件以及相关文件、原始数据集、训练数据集XML版、增强扩充…...
【Linux】—— Linux进程状态(R、S、D、T、Z、X)
🌏博客主页:PH_modest的博客主页 🚩当前专栏:Linux跬步积累 💌其他专栏: 🔴 每日一题 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮࿰…...
重生之我在NestJS中使用EventStream
有一个需求是需要长连接等待后台的返回,我们使用的EventStream,在NestJS中使用很简单,框架基本上已经封装好了 0. 如果没有创建项目的,可以先创建一个项目,创建项目的直接跳转到下一个步骤去 全局安装 nest: npm inst…...
自动化工具Selenium IDE基本使用——脚本录制
1 简介 Selenium相信大家都知道,在做自动化操作时,要使用浏览器驱动直接控制浏览器操作的时候,大多会结合Selenium框架使用。 但在对网页操作自动化的时候,实际上有一种更轻量的做法,那就是直接使用Selenium IDE&…...
【第十一天】进程调度算法,进程间通信方式,进程同步和互斥
进程调度算法有哪些 进程调度算法是操作系统中用来管理和调度进程(任务,作业)执行的方法。这些方法决定了在多任务环境下,如何为各个进程分配CPU时间,以实现公平性、高吞吐量、低延迟等目标。 先到先服务调度算法&am…...
Python的lambda函数
Python中的lambda函数是一种小型匿名函数,它允许你在需要函数对象的地方快速定义单行的小函数。lambda函数通常用于编写简洁的代码,尤其是当使用高阶函数(如map()、filter()、reduce()等)时。它们可以接收任何数量的参数ÿ…...
java9-泛型
1.泛型的简介 1.1 什么是泛型 泛型是一种特殊的数据类型。 它是Java 的一个高级特性。在 Mybatis、Hibernate 这种持久化框架,泛型更是无处不在。 在这之前,不管我们在定义成员变量时,还是方法的形参时,都要规定他们的具体类型…...
zotero安装与使用
文献管理工具) Zotero软件官网https://www.zotero.org/download,不修改安装位置,默认安装就行;安装完成官网直接邮箱注册一个账号,软件登陆账号:编辑-首选项-同步 修改论文保存位置,有从其它电脑拷贝过来的…...
Elasticsearch未授权访问漏洞
7.Elasticsearch未授权访问漏洞 Elasticsearch服务普遍存在一个未授权访问的问题,攻击者通常可以请求一个开放9200或9300的服务器进行恶意攻击。 步骤一:使用以下Fofa语法进行Elasticsearch产品搜索 "Elasticsearch" && port"9200" …...
n600高效涡流选粉机设计【说明书 CAD图纸 开题报告 任务书 实习报告】
n600高效涡流选粉机作为粉体分级领域的核心设备,其设计聚焦于提升分级精度与处理效率。该设备通过优化涡流场分布与颗粒运动轨迹,实现微细粉体的高效分离。其核心作用在于利用离心力和气流的复合作用,使不同粒径的颗粒在旋转流场中产生差异化…...
Qwen3-TTS快速部署指南:Web界面操作,无需代码基础
Qwen3-TTS快速部署指南:Web界面操作,无需代码基础 1. 引言:语音合成的零门槛体验 你是否曾经想过为自己的项目添加语音功能,却被复杂的代码和配置吓退?现在,借助Qwen3-TTS-12Hz-1.7B-Base镜像,…...
BilibiliDown:从技术视角重新定义B站视频下载体验
BilibiliDown:从技术视角重新定义B站视频下载体验 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bi…...
收藏必备!小白程序员快速入门RAG,轻松提升大模型生成效果与准确性
RAG(检索增强生成)是一种提升大模型生成内容准确性和时效性的技术框架。通过从外部知识库检索信息,再将检索结果与大模型结合,有效解决大模型知识过时和幻觉问题。RAG流程包括知识嵌入存储、相似度检索和增强生成三个核心环节&…...
Kali Linux 2026.1 重磅发布,内核升至6.18
作为全球最受欢迎的渗透测试与安全审计Linux发行版,Kali Linux在2026年迎来了年度首发版本——Kali Linux 2026.1。这次更新不仅延续了每年“.1”版本的视觉刷新传统,更特别致敬BackTrack Linux 20周年,引入“BackTrack模式”,同时升级内核至6.18,并新增8款实用工具。无论…...
手把手教你用DrissionPage搭建个人新闻聚合器:自动抓取百度热搜并保存到Excel
用DrissionPage打造智能新闻聚合器:从百度热搜抓取到Excel自动化分析 每天手动刷新闻不仅耗时,还容易错过重要信息。想象一下,如果有个私人助手能自动收集全网热点,整理成结构化的报告,甚至生成直观的可视化图表——这…...
智能水塔改造指南:用S7-200PLC+超声波传感器实现低成本自动化
智能水塔改造实战:S7-200PLC与超声波传感器的低成本自动化方案 在农村和小型工厂的实际运营中,水塔作为重要的供水设施,其稳定性和自动化程度直接影响着日常生产和生活。传统的人工监控方式不仅效率低下,还存在水位失控的风险。本…...
PCB拼板工艺全解析:从设计到生产的核心要点
1. PCB拼板的核心价值与必要性PCB拼板是电子工程中一项看似简单却极为关键的工艺环节。作为一名从业十年的硬件工程师,我处理过上千款PCB设计,深刻体会到合理拼板对生产效率和成本控制的影响。简单来说,拼板就是将多块相同或不同的PCB按照特定…...
SOONet模型Python从入门到集成:环境配置与核心调用
SOONet模型Python从入门到集成:环境配置与核心调用 如果你刚接触AI模型,想用Python把SOONet这样的模型跑起来,可能会觉得有点无从下手。环境怎么配?依赖库怎么装?模型文件放哪里?代码怎么写?这…...
Qwen-Image-Edit-2511保姆级教程:零基础学会AI修图,效果惊艳
Qwen-Image-Edit-2511保姆级教程:零基础学会AI修图,效果惊艳 1. 前言:为什么选择Qwen-Image-Edit-2511 如果你还在为Photoshop复杂的操作界面头疼,或者想快速实现专业级的图片编辑效果,那么Qwen-Image-Edit-2511绝对…...
