AQS 源码解读

数据结构课程设计C/C++版--美团餐馆预定信息的管理与分析 5 6 第5关:注销个人信息。 阅读详情

1.先看一下类图

2.开始跟代码

找一个入口

new ReentrantLock()默认是非公平锁,false是非公平

进入lock.lock(),在 ReentrantLock中的实现

看到是sync的lock方法 Sync 是ReentrantLock的子类 

找抽象方法lock()在非公平锁中的实现

compareAndSetState(0,1) 如果状态是0 更新为 1
setExclusiveOwnerThread(Thread.currentThread()); 设置持有线程为当前线程

如果当前状态不是0,则 运行 acquire(1)

看!tryAcquire(arg)方法,进入是一个 

找他在非公平锁中的实现

显然状态不是0,当前线程也不是线程执行占有者 返回false;

返回到这张图:!tryAcquire(arg) == true

再看另一个条件 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)

进入代码前先看一下Node的几个状态

再看addWaiter(Node.EXCLUSIVE) 添加等待者,为当前线程创建一个队列节点

现在AQS的tail == null,所以直接进入enq(node);

一个自旋, 

第一次循环t==null, AQS的head和tail 都设置成 new Node();

第二次循环 t != null 这个新结点 前指针指向当前线程,tail也指向当前线程

 

返回到 acquireQueued(addWaiter(Node.EXCLUSIVE), arg)

final Node p = node.predecessor();获取node的prev节点,而第一个节点是一个空节点 哨兵节点
p == head is true   
如果再次尝试获取(tryAcquire(arg))失败返回false lock()方法结束
但是再次尝试获取失败 进入 
if (shouldParkAfterFailedAcquire(p, node) &&parkAndCheckInterrupt())

pred.waitStatus 节点默认为0, 运行 compareAndSetWaitStatus(pred, ws, Node.SIGNAL)

把pred.waitStatus 设置成 -1 ,再次循环进来 返回 true;

再 回到AQS870行 运行 parkAndCheckInterrupt()  挂起当前线程

 

到现在lock方法结束;当遇到unpark方法后继续循环 再次尝试获取(tryAcquire(arg);成功后

释放 哨兵节点(第一个节点) 把当前节点 设置成head 作为哨兵节点.

 

继续看unlock方法 ReentrantLock中

 

AQS中:

tryRelease(arg) 尝试释放,在ReentrantLock中实现

因为当前持有锁 getState() = 1
int c = getState() - releases, 
set State = 0 
设置占有线程为null
retrun true;

返回AQS的release方法

lock()方法时候 h.waitStatus = -2 运行 unparkSuccessor(h);

head节点 状态小于0,设置为0,next 节点不为null,执行 LockSupport.unpark(s.thread) 唤醒;

 

 

 

 

 

 

 

 

 

 


 

 

 

AI辅助需求分析与提示词生成 文章标题 《AI辅助需求分析与提示词生成》 关键词 人工智能 需求分析 提示词生成 深度学习 机器学习 强化学习 数学模型 系统架构 阅读详情

相关推荐

新手避坑:RT-Thread-Studio外设驱动配置最容易忽略的3个地方(附WDT实例)

本文针对RT-Thread-Studio新手在配置外设驱动时常见的编译报错问题,以看门狗(WDT)为例,详细解析了最易忽略的三个关键配置环节:RT-Thread-Studio的图形化Setting开关、Kconfig中的依赖关系以及SConscript的编译规则。掌握这三层配置模型,能有效避免头文件包含正确却依然编译失败的问题,确保驱动代码被正确加入构建。

gray5的博客 506

ReentrantLock

ReentrantLock底层基于AbstractQueuedSynchronizer(AQS)实现,AQS抽象类定义了一套多线程访问共享资源的同步模板,是一个依赖状态(state)的同步器。解决了实现同步器时涉及的大量细节问题,能够极大地减少实现工作,简单的说,AQS为加锁和解锁过程提供了统一的模板函数,只有少量细节由子类自己决定。对应的设计模式就是模版模式一般通过定义内部类Sync继承AQS,将同步器所有调用都映射到Sync对应的方法;

qq_31603875的博客 993

AI大模型API中转站选型指南:12项关键指标与实战评估

随着AI大模型技术的快速迭代,企业面临着一个核心挑战:如何在基础模型频繁更新的背景下,为业务系统选择稳定可靠的API中转服务?本文基于真实生产环境测试数据,从12个关键维度系统评估主流API中转站平台,帮助技术团队在模型快速演进的生态中做出科学选型决策。 1. API中转站的核心价值与业务场景 1.1 什么是API中转站 API中转站(API Gateway/Aggregator)是连接业务系统与多个大模型厂商的中间层服务。它通过统一的接口封装了不同厂商的API协议差异,为企业提供标准化的模型调用能力。在实

weixin_29056101的博客 446

根据ReentrantLock -- 解析AQS原理

java.util.concurrent.locks.AbstractQueuedSynchronizer 是什么 aqs,这是一个队列同步器框架,JUC中的公平锁、非公平锁、重入锁都是以aqs作为基础框架的,定义了加锁、释放锁,加共享锁等一些逻辑 AQS是一个抽象类,内部使用了一个FIFO的等待队列,用于多线程等待锁排队,通过state表示当前资源的加锁状态; aqs是基础类,类中定义了模板方法,只需要实现对应的模板方法即可;aqs的作者是Doug Lea aqs内部维护的双向队列,大致是这样的,其中

小小少年的博客 795

kubeadm init 运行时kebelet启动失败问题

解决k8s kubeadm init时遇到的kubelet问题

ZDPZN的博客 6074

GEE——土地利用分类之监督分类

利用GEE做监督分类,以武汉市为例。 训练器我们选择随机森林;数据选择Landsat-8;训练样本使用的是GEE提供的一种,它把地表分为三类:水体、植被和城市用地。 选择训练样本 用要素集来标记训练样本。每个要素都有一个landcover 的属性,0表示城市用地,1表示植被,2表示水体。 对影像进行分类 其中一部分进行分类器的训练,还有一部分留下来做精度验证。 输出影像及混淆矩阵 print(LABEL_DATA); var wuhan = ee.FeatureCollection('users/

qq_41600680的博客 1万+

AQS-为什么队列头节点的Thread是null

如果是队列刚刚初始化的头节点,是这样的: 可以发现这Node类的构造函数没做任何赋值,而Node类中有一个属性是Thread 那既然没赋值,thread对象就肯定是null了。所以队列初始化的头节点的Thread是null。 如果队列已经初始化完成,头节点设置如下: 可以发现设置新的头节点时,新的头节点的thread也会被设置为null。 那为什么队列头节点的Thread要是null呢? 这里可以这样去理解,头节点是不参与排队的,因为它已经获得了同步状态了,那么就说明该头节点的相关线程.

硅脂味咖啡的博客 4085

FPGA信号处理系列文章——分数倍插值抽取滤波器(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 FPGA信号处理系列文章——分数倍插值抽取滤波器(一)前言信号流matlab模型频谱示意图分析总结 前言 变采样率滤波器不仅仅存在整数倍插值和整数倍抽取的情况,还会存在分数倍插值抽取的情况。那这种情况下要怎么处理呢 信号流 分数倍插值抽取滤波器的信号流是什么?信号先进行插值,再进行FIR滤波,最后进行抽取 matlab模型 %signal 定点化数据输入 coeff_val_fir = importdata('fir.coe'); si

gzy0506的博客 1万+

ReentrantLock那点事

一、引言 在学习ReentrantLock源码之前,先来回顾一下链表、队列数据结构的基本概念~~ 二、数据结构 2.1 链表(Linked List) 小学一、二年级的时候,学校组织户外活动,老师们一般都要求同学之间小手牵着小手。这个场景就很类似一个单链表。每个小朋友可以看作一个节点信息,然后通过牵手的方式,形成整个链表结构。 1、链表是以节点的形式来存储数据,可以称之为:链式存储 2、每个节点都包含所需要存放对应的数据(data 域),以及指向下一个节点的元素(next 域)。 3、链表可以

爱琴孩的博客 673

ThingsBoard教程(十九):规则节点概览介绍

在ThingsBoard的CE V2.5.6版本中,一共有这几种类型在每一种类都有包含了多个节点,每一种类型的节点都有不同的颜色表示本篇文章做一个简单的概括,后续的文章会详细讲解每一个种类的节点如何使用,每一个节点的使用。一共有10个,使用黄色表示 过滤器节点用于消息过滤和路由。一共有9个,使用绿色 属性节点用于更新传入消息的元数据。一共三个,使用蓝色 转换节点用于更改传入消息字段,如发起者、消息类型、有效负载和元数据。一共21个,使用红色标识 动作节点根据传入的消息执行各种动作。一共9个,使用黄色表示,

知无涯 1万+

(十五)CX20106A 中超声波测量的应用

(十五)CX20106A 中超声波测量的应用

m0_52555663的博客 4511

深入理解AQS(AbstractQueuedSynchronizer)

深入理解AQS(AbstractQueuedSynchronizer) AbstractQueuedSynchronizer(AQS)是JDK中实现并发编程的核心,平时我们工作中经常用到的ReentrantLock,CountDownLatch,Semaphore等都是基于它来实现的。 AQS类中维护了一个双向链表(FIFO队列), 如下...

Touch 1449

让 IF 更好读:在 ABAP 里尽量使用正向条件的实战指南

摘要:SAP系统开发中,代码可读性与可维护性的关键往往在于条件判断的写法。Clean ABAP风格指南建议尽量采用正向表达的条件判断,如使用has_entries = abap_true而非否定式写法。正向表达能降低理解成本,避免"否定的否定"带来的逻辑混乱,但不应为追求正向而制造空分支。在团队协作中,正向条件更利于代码评审和测试覆盖,建议通过工具检查和智能评审确保规范执行。落地时可关注变量命名正向化、避免空分支、主流程清晰展开等要点,以提升长期维护效率。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 246

AQS源码详细解读

AQS源码详细解读 文章目录AQS源码详细解读基础CAS相关知识通过标识位进行线程挂起的并发编程范式MPSC队列的实现技巧代码讲解独占模式独占模式下请求资源独占模式下的释放资源共享模式请求资源释放资源条件变量await方法signal方法总结为什么需要SIGNAL状态为什么需要PROPAGATE状态 基础 在讲解AQS之前,有几个额外的知识需要了解。知道了这些,才能明白AQS框架中很多代码的道理。...

kuangzhanshatian的专栏 487

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JAVA - AQS源码解读

JAVA - AQS源码解读 前言 AQS全称AbstractQueuedSynchronizer。是Lock、CountDownLatch、Semaphore(信号量)的基础。这个AQS我在大约一年多以前看过一次,但是当时水平有限,根本没看懂什么意思,最后对于AQS的理解都是来自于网上的博文,可以说是吃人家嚼过的。。这次重读源码还是收获颇丰。 Node 看一下Node的结构: 1 2 3 4 5 6 7 8 .

Java的专栏 356

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

AQS类源码解读

我把AQS类从共享锁和排他锁【获取锁】到共享锁和排他锁【释放锁】,从逻辑分析到源码解析都给大家安排的明明白白,由外到内一层层分析源码,以下内容除源码,其他纯手打(包括所有注释),希望对大家有帮助哈!!!

m0_63164811的博客 298

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

AQS原理源码解读

原文指路 AQS类 1.类图 红色线是内部类 AbstractOwnableSynchronizer:抽象类,定义存储独占当前线程的属性和设置,获取当前线程的方法 AbstractQueuenSynchronize:抽象类,AQS框架核心类,内部以虚拟队列的方式管理线程的锁获取与锁释放,其中获取锁(tryAcquire方法)和释放锁(tryRelease方法)并没有提供默认的实现,需要子类重写方法的具体逻辑,目的是使开发人可以自定义获取锁和释放锁的方式 Node:AbstractQueuenSynchr

weixin_51699336的博客 284

走进 java AQS——第一期互斥加锁及解锁过程源码解读

亲爱的各位读者大家好呀!本期小卡将代领大家走进java JUC包下的 AQS(队列同步器)。先简单的介绍一下AQS吧!AQS(Abstract Queue Synchronizer)是Java中一个用于实现同步器的抽象类,位于包中。它提供了构建复杂同步工具(如锁、信号量和屏障)的基础框架。Semaphore开发者可以通过继承AQS并重写相关方法(如tryAcquiretryRelease等)来实现自定义的同步行为。总的来说,AQS是Java并发编程中非常重要的组件,为高效的多线程同步提供了灵活的解决方案。

weixin_74019136的博客 887

源码解读系列之并发编程AQS

Java 并发编程 AQS 源码解读

qq_25305565的博客 1006

java并发之AQS共享模式源码解读

java并发之AQS共享模式源码解读 上一篇文章简单解读了AQS的源码以及独占模式下获取锁的流程以及细节,碍于篇幅,这篇文章来说说AQS的共享模式。 共享锁的一个实现类就是信号量Semaphore,Semaphores一般用于对某种访问资源的限制,一个信号量相当于持有一些许可(permits),线程可以调用Semaphore对象的ac...

nongfuyumin的专栏 476

AQS第三篇 —— 深入源码解读

从根本上说 ,如果你不懂AQS ,没有深入的理解AQS的设计艺术,那么你就谈不上真的意义上的懂得JUC编程

weixin_45844836的博客 294

并发编程面试题——AQS源码解读

讲解java并发编程AQS源码

weixin_45150104的博客 734

AQS源码解读(一)——AQS是什么?CLH变种体现在哪里?并发控制的核心在哪里

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。实际上,作为程序员,丰富自己的知识储备,提升自己的知识深度和广度是很有必要的。

2401_84691757的博客 981

AQS源码解读

AQS 抽象队列同步器(Abstract Queued Synchronizer,AQS)作为并发包JUL中一个基础组件,用来实现各种锁和同步组件,AQS主要由状态state变量、加锁线程和等待队列组成。AQS定义了多线程访问共享资源的框架,AQS定义了Exclusive(Reentrantlock)和share(Semaphore和CountDownLacth)两种资源共享方式,在不同的组件中都有基于AQS的自定义同步器,不同的自定义同步器主要区别在获取state的方式不同。 AQS内通过一个FIFO队.

huhu123444的博客 2016

AQS同步器源码解读

import sun.misc.Unsafe; import java.util.Collection; import java.util.concurrent.locks.AbstractOwnableSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Loc...

zhaoquanwei2018的博客 555

AQS原理以及源码解读

AQS概述: 全称是AbstractQueuedSynchronizer,是一个阻塞式锁和相关的同步器工具的框架 特点: 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取 锁和释放锁 getState - 获取 state 状态 setState - 设置 state 状态 compareAndSetState - cas 机制设置 state 状态 独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源 提供了

JMU_software19的博客 380
上一篇: 面试官问:ZooKeeper是强一致的吗?怎么实现的?
下一篇: 常见代码重构技巧(非常实用)
木木那年
博客等级 码龄12年 37粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值