多线程与高并发5-AQS

多线程安全——AQS 概念 AbstractQueuedSynchronizer抽象类(以下简称AQS)是整个java.util.concurrent包的核心。在JDK1.5时,Doug Lea引入了J.U.C包,该包中的大多数同步器都是基于AQS来构建的。AQS框架提供了一套通用的机制来管理同步状态(synchronization state)、阻塞/唤醒线程、管理等待队列。如常用的 ReentrantLock/Semaphore/CountDownLatch都是依赖于它。 参考文献 https://segmen 阅读详情

AQS

1、state和共同操作该state的双向链表。
在这里插入图片描述
2、双向链表用于查看前一节点状态
3、CAS+Volitile state(通过head获取当前状态,tail添加队列元素)
4、state是volitile修饰的,设置state方法,有setState()和compareAndState()[unsafe];
5、AQS主要方法:tryAcquire,tryRelease,tryAcquireShared,tryReleaseShared,isHeldExclusively

//reentrantLock
final boolean nonfairTryAcquire(int acquires) {
            final Thread current = Thread.currentThread();
            int c = getState();//获取state
            if (c == 0) {
                if (compareAndSetState(0, acquires)) {//CAS
                    setExclusiveOwnerThread(current);
                    return true;
                }
            }
            else if (current == getExclusiveOwnerThread()) {//重入
                int nextc = c + acquires;
                if (nextc < 0) // overflow
                    throw new Error("Maximum lock count exceeded");
                setState(nextc);
                return true;
            }
            return false;
        }
//aqs
 private Node addWaiter(Node mode) {
        Node node = new Node(Thread.currentThread(), mode);//mode,exclusive,Shared
        // Try the fast path of enq; backup to full enq on failure
        Node pred = tail;
        if (pred != null) {
            node.prev = pred;
            if (compareAndSetTail(pred, node)) {//cas自旋锁插入到链表最后一个节点
                pred.next = node;
                return node;
            }
        }
        enq(node);
        return node;
    }
final boolean acquireQueued(final Node node, int arg) {
        boolean failed = true;
        try {
            boolean interrupted = false;
            for (;;) {
                final Node p = node.predecessor();//获取前置节点(双向链表)
                if (p == head && tryAcquire(arg)) {//头结点,尝试拿到锁
                    setHead(node);
                    p.next = null; // help GC
                    failed = false;
                    return interrupted;
                }
                if (shouldParkAfterFailedAcquire(p, node) &&
                    parkAndCheckInterrupt())//阻塞
                    interrupted = true;
            }
        } finally {
            if (failed)
                cancelAcquire(node);
        }
    }

获得锁
在这里插入图片描述
释放锁
AQS,release->tryRelease,尝试释放通过state-1,state如果为零释放

JUC之AQS原理-多线程与高并发 AQS是AbstractQueuedSynchronizer的缩写,该类是java.util.concurrent.locks包下的一个核心基础类,实现的功能主要是控制多个线程进行排队获得锁。 AQS有很多具体的实现子类,比如ReentranLock、CountDownLatch、Semaphor 拿ReentranLock来说,其主要代码逻辑是依靠其内部抽象类Sync具体实现。Sync是AbstractQueuedSynchronizer的子类。 阅读详情

相关推荐

ReentrantLock与AQS:深入剖析多线程同步的艺术

ReentrantLock与AQS共同构成了Java并发编程中的强大工具,它们通过高效的同步状态管理、线程等待队列机制、CAS操作等,确保了多线程环境下对共享资源的正确访问。深入理解ReentrantLock和AQS的原理与实现,是掌握Java并发编程的关键。通过源码分析,可以更加深入地了解这些机制的实现细节,为编写高效、安全的并发程序提供有力支持。

m0_51176516的博客 883

AQS与CAS

AQS全名为AbstractQueuedSynchronizer:抽象的同步队列 CAS全名为CompareAndSet:比较与设置原子操作 今天咱们以ReentrantLock为例来讲解AQS与CAS 首先咱们看下ReentrantLock类图 这里包括两个部分 ReentrantLock类图 从类图可以看出,ReentrantLock实现了Lock接口 //Lock接口中定义这这么多方法,咱们重点看下lock()与unlock()方法 lock() //获取锁 lockInterruptibly() t

蜗牛也需要奔跑 500

CEH Practical 实战考试真题与答案

CEH Practical 是 EC-Council 推出的Certified Ethical Hacker(CEH)认证项目中的一项高级动手实践考试。它不同于传统的理论考试,侧重于在真实环境中检验考生的实操能力。

sgafdgdagd的博客 966

并发5:CAS

1. 简介 CAS 全拼为 Compare And Swap 比较和交换, 也有人理解为 Compare And Set比较和赋值 2. 锁与共享变量 加锁是一种悲观的策略,它总是认为每次访问共享资源的时候,总会发生冲突,所以宁愿牺牲性能(时间)来保证数据安全。 无锁是一种乐观的策略,它假设线程访问共享资源不会发生冲突,所以不需要加锁,因此线程将不断执行,不需要停止。一旦碰到...

逆光世间 227

大厂嵌入式面试常考八股文及算法

1.指向已被释放或无效的内存地址的指针是野指针。互斥锁是一种用于线程同步的机制,用于确保同一时间只有一个线程访问共享资源。多态是面向对象编程中的一种特性,它允许以一种统一的方式处理不同类型的对象,通过相同的接口可以表现出不同的行为。大小端(Endian)指的是在计算机存储和处理多字节数据时,字节的存储顺序。大端序(Big Endian):高位字节存储在低地址,低位字节存储在高地址。类似于将数字的高位放在左边,低位放在右边的表示方式。例如整数值0x12345678在内存中按照大端序排列为。

谢谢大家的关注 6152

保姆级教程:用K210麦克风阵列模块实现声源定位(附完整Python代码与坐标计算)

本教程详细介绍了如何使用K210麦克风阵列模块实现高精度声源定位,包括硬件连接、算法解析与实战代码。通过Python代码示例,展示了从原始数据获取到三维空间坐标计算的完整流程,适用于智能家居、机器人导航等场景。

weixin_42558093的博客 226

深入解析Java多线程与并发编程(五)(JUC显示锁、AQS抽象同步器以及JUC高并发容器)

本文介绍了JUC显式锁、AQS抽象同步器以及JUC高并发容器的基本概念。JUC显式锁是一种灵活的Java实现锁,支持多种锁操作,如可轮询、定时、可中断等。显式锁的核心接口是Lock,其主要实现类为ReentrantLock,具有可重入、独占等特性。显式锁可分为可重入锁、不可重入锁、悲观锁、乐观锁、公平锁、非公平锁、可中断锁、不可中断锁、共享锁和独占锁等类型。悲观锁适用于写多读少场景,而乐观锁适用于读多写少场景。公平锁保障线程按顺序获取锁,非公平锁则不保证。可中断锁允许在抢占过程中中断,而不可中断锁则不允许。

wxchyy的博客 1415

从零开始:kohya_ss环境部署与LoRA/SDXL模型训练实战指南

本文提供了一份详细的kohya_ss环境部署与模型训练实战指南。从零开始,手把手教你使用Conda创建虚拟环境、安装依赖并启动Web GUI界面。核心内容涵盖高质量数据集的准备方法,并重点解析了如何使用kohya_ss工具进行LoRA模型和SDXL模型的微调训练,包括关键参数配置与常见报错解决方案,帮助初学者快速上手AI绘画模型定制。

weixin_29162439的博客 534

如何用Java的AQS实现高并发计数器?

AbstractQueuedSynchronizer(AQS)是Java并发包中的一个核心类,它为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(如信号量、事件等)提供了一个基础框架。AQS通过一个int类型的state变量来表示同步状态,并通过内置的FIFO队列来管理等待线程。Java中的AQS框架为构建各种多线程同步工具提供了强大的基础。:允许一个或多个线程等待,直到其他线程完成一系列操作,适用于一次性同步的场景。

qq_39144436的博客 1019

uCOS中的消息邮箱(:task与task之间传递一个数据(数据缓冲区))

程序需求,需要完成task与task之间  字符数组的数据传输 比如:在ucos中,串口2接收的字符数组是不定时的&不定长的;只有当接收到数据的时候_才将数据赋值给新数组 具体的程序示意如下: 图1:消息邮箱测试中的     向消息邮箱发送消息(OSMboxPost(Str_Box,(void*)rec);//发送消息--(向 消息邮箱_msg_key发送消息) ),实际项目需求的

faguoduifangui的博客 4540

MIKE 21 教程 1.2 网格搭建界面介绍之点线面要素的高阶处理 (Mesh Generator 工具)

MIKE 21 教程 手把手教学系列 1.1 网格搭建界面介绍之点线面要素的高阶处理 (Mesh Generator 工具) ​ 上一篇文章讲解了如何创建基本的点、线、面要素 MIKE 21 教程 1.1 网格搭建界面介绍之点线面的创建 本节来讲一下对点线面要素的高阶处理,主要包括要素修改与打断线(break line)的讲解 ​

Hello Word 4147

JAVA多线程与高并发(四)[LockSupport,AQS解读]

link-JAVA多线程与高并发系列[前言,大纲,目录] LockSupport 关键方法: park(): 当前线程阻塞(如果当前线程没有被unpark) unpark(Thread thread):如果入参的线程正在park(),则让它恢复运行;否则,就保证下一次该线程park()时不会阻塞. unpark(t)必须在线程t启动(start)后才有效果. 可以这么理解:unpark相当于是...

书院二层楼 396

我的宠物狗学编程:从零开始的代码之旅

在这个示例中,我们定义了一个名为"interact"的函数,它通过输入函数获取用户的输入,并根据输入执行相应的代码块。在编程中,我们使用条件语句来根据不同的条件执行不同的代码块。对于我的狗狗,我将创建一个名为"feed"的函数来表示它的进食行为,并根据不同的条件输出不同的信息。在这个示例中,我们定义了一个名为"feed"的函数,并使用一个参数"food"来表示食物。对于我的狗狗,我将创建一个名为"dog_name"的变量来存储它的名字。对于我的狗狗,我将创建一个名为"bark"的函数来表示它的叫声。

2301_79331387的博客 333

Java 多线程的 volatile 和 AQS

Java 内存模型()就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了 Java 程序在各种平台下对内存的访问都能保证效果一致的机制及规范。JMM是一种规范,是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的是保证并发编程场景中的原子性、可见性和有序性。在 Java 中,为了保证原子性,提供了两个高级的字节指令和 Monitorexit。这两个字节码,在 Java 中对应的关键字就是。

JAVA开发区的博客 945

TenserRt平台SMOKE 3D目标检测部署完整教程:从理论到实践

本教程详细介绍了在RK3588平台上部署SMOKE 3D目标检测模型的完整流程。SMOKE是一种创新的单阶段单目3D检测方法,通过关键点估计直接预测3D目标信息,有效解决了深度信息缺失等挑战。文章从理论基础出发,解析了SMOKE的核心算法和网络架构,包括DLA-34主干网络和关键点中心化策略。同时提供了详细的Docker环境配置、模型导出到ONNX格式的实践指南,以及TensorRT引擎构建和性能优化的关键技术要点。该教程为开发者在嵌入式平台上实现高效3D目标检测提供了完整的技术参考。

LXY_LOVE36的博客 371

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Java】多线程和高并发编程(三):锁(中)深入ReentrantLock

AQS就是AbstractQueuedSynchronizer抽象类,AQS其实就是JUC包下的一个基类,JUC下的很多内容都是基于AQS实现了部分功能,比如ReentrantLock,ThreadPoolExecutor,阻塞队列,CountDownLatch,Semaphore,CyclicBarrier等等都是基于AQS实现。首先AQS中提供了一个由volatile修饰,并且采用CAS方式修改的int类型的state变量。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

深入理解 Java 多线程(五):原子操作类与 AQS 核心解析

LongAdder的增强版,通过自定义累加函数,可实现最大值、最小值、乘积等复杂计算。代码示例 1:统计多线程最大值// 自定义累加函数:取两个值的最大值,初始值为Long.MIN_VALUE(确保第一个值能覆盖)// 5个线程各生成0~999的随机数,原子更新最大值i++) {try {System.out.println("线程" + Thread.currentThread().getId() + "生成随机数: " + randomNum);// 累加=更新最大值。

jiajiachonga的博客 2457

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

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

多线程高并发基础知识及面试总结——源码分析

java多线程面试相关1. 概念1.1 区分程序、进程、线程1.2 线程和进程有什么区别?1.3. 说说并发与并行的区别?1.4 多线程1.4.1 为啥使用多线程1.4.2 啥叫上下文切换1.4.3 Java中如何实现多线程以及比较优缺1.5 线程池1.6 线程分类:1.7 说说乐观锁与悲观锁2. Thread类2.1 Thread类的方法2.2 线程启动2.3 线程的生命周期2.4 线程通信:wait()、sleep()、yield()、notify()、notifyAll() 辨析2.5 线程死锁

尚墨1111的博客 1053

Lock简介与初识AQS

文章目录concurrent包的结构层次Lock简介Lock接口API初识AQSAQS的模板方法设计模式一个例子 concurrent包的结构层次 在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurren...

ThinkWon的博客 1万+

Java并发之AQS全面详解

​ AQS全称 AbstractQueuedSynchronizer,即抽象的队列同步器,是一种用来构建锁和同步器的框架。基于AQS构建同步器:优势:2.1 AQS核心思想  如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。如图所示:Sync queue: 同步队列,是一个双向列表。包括head节点和t

JavaShark的博客 1万+

Java多线程 同步队列详解(AQS)

Java多线程 同步队列详解(AQS) 文章目录Java多线程 同步队列详解(AQS)1、AQS简介1.1 什么是AQS1.2 什么是CLH锁队列2、ASQ 提供的各种锁实现流程2.1 独占锁2.2 共享锁2.3 可重入锁2.4 公平锁与非公平锁2.5 读写锁 1、AQS简介 1.1 什么是AQS 队列同步器(AQS)是用来构建锁或者其他同步组件的基础框架,使用一个int型变量代表同步状态,通过内...

烟雨gps 1869

AQS(AbstractQueuedSynchronizer)源码深度解析(5)—条件队列的等待、通知的实现以及AQS的总结【一万字】

详细介绍了AQS中的条件队列的原理,以及等待、通知的实现,以及AQS的总结。

终生学习践行者 4584

多线程与高并发系列五(ReentrantLock)

多线程与高并发系列五(Lock)

一只小菜鸡的博客 2491

AQS队列到底是什么?

文章目录前言:为什么要了解AQS?一、AQS是什么?二、AQS如何实现的?2.1、state2.2、FIFO同步队列三、AQS一些特点3.1 共享锁和独占锁3.1.1 要实现一个独占锁,需要重写tryAcquire,tryRelease方法3.1.2 要实现共享锁,需要重写tryAcquireShared、tryReleaseShared3.2 等待状态位四、了解AQS的整体流程五、AQS详细分析5.1 Sync.nonfairTryAcquire5.2 AbstractQueuedSynchronizer

qq_45827239的博客 4694

面试必知必会(7):多线程AQS

摘要: 本文是Java多线程面试系列文章之一,深入解析AQS(AbstractQueuedSynchronizer)框架的核心原理。AQS作为Java并发包的基础组件,为ReentrantLock、Semaphore等同步工具提供了底层支持。文章重点剖析了AQS的两大核心设计:通过volatile修饰的state变量管理同步状态,采用CLH双向队列实现线程排队机制。详细讲解了state变量的多线程可见性和原子操作特性,以及节点状态(CANCELLED、SIGNAL等)在队列管理中的关键作用。全文以Reent

从基础到源码解析的学习记录 1435

多线程与高并发三:AQS底层源码分析及其实现类

上篇说了CAS和volatile,这一篇主要介绍综合了CAS和volatile的AQS。 一:AQS 1:AQS是AbstractQueuedSynchronizer的简称。 有一个共享资源变量state:AQS state是一个volatile标志的Int整形数,支持多线程下的可见性。根据子类的不同取不同的意义。跟随着state的还有一个FIFO等待队列,是一个双向链表,一个节点中表示一个线程,有前节点,后节点。多线程竞争state被阻塞会进入此队列,实现方式为CAS。当等待队列中的一个节点拿到了stat

qq_40230026的博客 667
上一篇: 多线程与高并发4-线程之间通讯
下一篇: 多线程与高并发6-ThreadLocal+强软弱虚
tgn123456
博客等级 码龄7年 28粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值