AQS之Node学习

AQS Node解析 本文作为解析AQS文章的第一篇,着重介绍队列元素的Node的实现。 java线程间通信方式 java线程间通信方式,有volatile基于可见内存可见性实现的通信,有管道PipedOutputStream,PipedInputStream 基于内存传递实现的通信,有等待通知机制实现的wait,notify,join等方式;实际等待通知机制也是基于共享内存实现的;这里引入一个管程 monitor 的概念,管程是指管理共享变量以及对共享变量的操作的过程。java关键字 synchronized 就是基于MESA 阅读详情

 

node的结构 

static final class Node {
 
    // 共享模式
    static final Node SHARED = new Node();
 
    // 独占模式
    static final Node EXCLUSIVE = null;
 
    static final int CANCELLED = 1;
    static final int SIGNAL = -1;
    static final int CONDITION = -2;
    static final int PROPAGATE = -3;
 
    /**
     * CANCELLED,值为1,表示当前的线程被取消
     * SIGNAL,值为-1,表示当前节点的后继节点包含的线程需要运行,也就是unpark;
     * CONDITION,值为-2,表示当前节点在等待condition,也就是在condition队列中;
     * PROPAGATE,值为-3,表示当前场景下后续的acquireShared能够得以执行;
     * 值为0,表示当前节点在sync队列中,等待着获取锁。
     */
    volatile int waitStatus;
 
    // 前驱结点
    volatile Node prev;
 
    // 后继结点
    volatile Node next;
 
    // 与该结点绑定的线程
    volatile Thread thread;
 
    // 存储condition队列中的后继节点
    Node nextWaiter;
 
    // 是否为共享模式
    final boolean isShared() {
        return nextWaiter == SHARED;
    }
 
    // 获取前驱结点
    final Node predecessor() throwsNullPointerException {
        Node p = prev;
        if (p == null)
            throw new NullPointerException();
        else
            return p;
    }
 
    Node() { // Used to establish initial heador SHARED marker
    }
 
    Node(Thread thread, Node mode) { // Used byaddWaiter
        this.nextWaiter = mode;
        this.thread = thread;
    }
 
    Node(Thread thread, int waitStatus) { //Used by Condition
        this.waitStatus = waitStatus;
        this.thread = thread;
    }
}

Node类中有两个常量SHARE和EXCLUSIVE,顾名思义这两个常量用于表示这个结点支持共享模式还是独占模式,共享模式指的是允许多个线程获取同一个锁而且可能获取成功,独占模式指的是一个锁如果被一个线程持有,其他线程必须等待。多个线程读取一个文件可以采用共享模式,而当有一个线程在写文件时不会允许另一个线程写这个文件,这就是独占模式的应用场景。


 waitStatus状态值解释

 

类型值说明
CANCELLED1当前节点由于超时或者中断被取消,节点进入这个状态以后将保持不变。
注:这是唯一大于0的值,很多判断逻辑会用到这个特征
SIGNAL-1后继节点会依据此状态值来判断自己是否应该阻塞、当前节点的线程如果释放了同步状态或者被取消、会通知后继节点、后继节点会获取锁并执行(当一个节点的状态为SIGNAL时就意味着其后置节点应该处于阻塞状态)
CONDITION-2当前节点正处在等待队列中,在条件达成前不能获取锁。
PROPAGATE-3当前节点获取到锁的信息需要传递给后继节点,共享锁模式使用该值
INITIAL0节点初始状态,默认值,表示当前节点在sync同步阻塞队列中,等待着获取锁

独占模式下,在同步队列中,节点的状态值为 1,-1,0;在等待队列中节点的状态值为1,-2,0

AQS中有两种队列,一是等待队列,二是同步阻塞队列。

2. 同步队列的结构

这里提一下,同步队列的头节点其实要么是一个无意义的空节点,要么是以 当前正在执行的线程 构建的节点,所以头节点其实是不阻塞的,或者说正是头节点阻塞了后续节点。

共享锁跟独占锁是同一个同步队列,也就是说同步队列中的节点既可以是共享类型也可以是独占类型(暂时不懂)

3. 等待队列的结构

 

 

 

 

 

 

基于Simulink的魔术公式轮胎动力学仿真 本篇博文主要用来记录汽车系统动力学课程的学习,仅供课程阶段参考,与实际工程应用还有较大距离。基于Simulink的魔术公式轮胎动力学仿真本实例主要有以下任务。1.建立魔术公式轮胎动力学仿真模型。2.绘制不同载荷下的轮胎纵向力—滑动率关系曲线。3.绘制不同载荷下的轮胎侧向力—侧偏角关系曲线。4.绘制不同载荷下的轮胎回正力矩—侧偏角关系曲线。提示:以下是本篇文章正文内容,下面案例可供参考。 阅读详情

相关推荐

从服装打版到激光切割:二维异形件排版算法在实际生产中的避坑指南

本文深入探讨二维异形件排版算法在服装、家具等行业的实际应用,对比NFP和重叠移除两种核心策略的优缺点,并提供算法落地的五大实战陷阱与解决方案。通过案例分析和技术要点解析,帮助生产管理者提升材料利用率5%-15%,优化生产效率。

weixin_28717431的博客 416

AQS同步队列中的节点状态

状态 说明 SIGNAL 值为-1,后继节点的线程处于等待状态,而当前节点的线程如果释放了同步状态或者被取消,那么就会通知后继节点,让后继节点的线程能够运行 CONDITION 值为-2,节点在等待队列中,节点线程等待在Condition上,不过当其他的线程对Condition调用了signal()方法后,该节点就会从等待队列转移到同步队列中,然后开始尝试对同步状态的获取 PROPAGATE 值为-3,表示下一次的共享式同步状态获取将会无条件的被传播下去 CANCELLED 值为...

硅脂味咖啡的博客 7199

Codex智能体从零搭建:环境配置、代码管理与MCP扩展实战

AI智能体(Agent)作为连接大语言模型与实际应用的关键技术,通过感知、决策与执行框架,将AI能力融入具体工作流。其核心原理在于利用提示工程、上下文管理与工具调用,将自然语言指令转化为可执行操作。在软件开发领域,AI智能体能够显著提升代码生成、项目管理和自动化任务的效率。通过Model Context Protocol(MCP)等标准化协议,智能体可以安全、结构化地集成外部工具与服务,实现能力扩展。本文聚焦于Codex这一AI驱动的代码助手平台,详细解析其环境配置、代码索引、记忆系统等核心模块,并深入探讨

weixin_34220179的博客 594

AQS中Node状态

在AQS(AbstractQueuedSynchronizer)中,Node 是一个用于构建等待队列的节点类,用于表示等待获取锁的线程。这些状态的具体含义和使用取决于具体的同步器实现,因为不同的同步器可能有不同的语义和处理逻辑。在实际使用AQS时,通常不需要直接操作 Node 的状态,而是通过同步器提供的方法来实现线程的同步和协作。当一个节点释放锁的时候,会唤醒它的后继节点,SIGNAL 就用于表示这个需要唤醒的状态。当一个线程等待获取锁的过程中被中断或超时,节点的状态可能被设置为 CANCELLED。

m0_54187478的博客 757

【ChatGPT实战案例】ChatGPT如何帮助产品经理高效工作?

1. 产品经理主要工作方向, 2. 具体工作中,向ChatGPT提问参考

weixin_62909516的博客 1902

[OpenCV]使用霍夫变换精准检测圆形原理详解与代码实战

dp`是累加器分辨率与图像分辨率的反比,例如`dp=1`时累加器与图像具有相同的分辨率,`dp=2`时累加器分辨率为图像的一半;`HoughCircles`函数的返回值`circles`是一个包含检测到的圆的参数列表,每个圆的格式为`(x, y, r)`,分别代表圆心的x坐标、y坐标和半径。可以使用`cv2.circle()`函数在原图上绘制出检测到的圆,并使用`cv2.imshow()`或`cv2.imwrite()`显示或保存结果图像。霍夫圆变换是霍夫变换的一种扩展,专门用于检测图像中的圆形轮廓。

yr_lu的专栏 513

AQS实现原理——Node节点

在介绍AQS之前,我们需要先来了解下Node节点类。AQS中的核心同步队列(CLH队列的变体)以及条件队列都是依靠Node节点来实现的。在线程没有竞争到锁资源时,会将线程信息包装成一个Node节点数据,该节点不仅记录了线程信息,还记录了线程的等待状态以及上下节点。

qq_33983753的博客 659

clumsy一款模拟弱网的工具

利用封装 Winodws Filtering Platform 的WinDivert 库, clumsy 能实时的将系统接收和发出的网络数据包拦截下来,人工的造成延迟,掉包和篡改操作后再进行发送。无论你是要重现网络异常造成的程序错误,还是评估你的应用程序在不良网络状况下的表现,clumsy 都能让你在不需要额外添加代码的情况下,在系统层次帮你达到想要的效果。

klb5555的专栏 2553

AQS原理

概念 AQS是AbstarctQueuedSynchronizer 的简称 ,是一个用于构建锁和同步容器的框架。 juc并发 包内许多类都是基于 AQS 构建的 ReentrantLock ReentrantReadWriteLock FutureTask AQS 解决了在实现同步容器时大量的细节问题。 AQS 使用一个 FIFO 队列表示排队等待锁的线程,队列头结点称作 “哨兵节点” ,它不与任何线程关联。 其他的节点与等待线程关联,每个阶段维护一个等待状态 waitStatus。 功能 独占

张三李四王五老六 1331

北斗导航 | ILS(仪表着陆系统)、MLS(微波着陆系统)和GBAS(地基增强系统)的性能对比

最 早 的 GBAS 系 统 是 **局 域 增 强 系 统(LAAS)**,它是 1990 年由美国 Honeywell 公司 和 NASA 共 同 完 成 的 差 分 GPS(DGPS)演 变 而 来 的。1998 年,LAAS 被 ICAO 采 纳为 GBAS。2009 年 9 月 3 日 Honeywell 公 司 的GBAS 系统通过了 **CAT-I 精密进近着陆系统**的设计认证 ,而 **CAT-II 和 CAT-III 系统的研发和验证工作也正在有序的进行中**

尘世冰封的专栏 3990

嵌入式SDIO 总线面试题及参考答案

SDIO 的 4 位总线模式是一种提高数据传输效率的工作模式。在传统的 1 位总线模式下,数据只能通过一根数据线(DAT0)进行传输,这限制了数据传输的带宽和速度。而在 4 位总线模式下,DAT0 - DAT3 这 4 根数据线同时用于数据传输,相当于在同一时间内可以传输 4 倍于 1 位模式的数据量,从而显著提高了数据传输的带宽和速度。要通过 CMD6 命令将 SDIO 总线从当前模式切换到 4 位总线模式,需要遵循以下步骤:第一步,主设备需要确保 SDIO 卡支持 4 位总线模式。

大模型大数据攻城狮的专栏 1719

一篇文章搞懂AQS!!!(持续更新)

AQS的核心思想 如果当前共享资源是空闲的,那么便会将请求资源的这个线程设为工作线程,并把资源的状态设置为锁定状态;如果资源正在被占用,那么就将请求的线程加入到工作队列(CLH队列中),等待唤醒。 CLH队列结构 AQS类的一些重要的字段 private volatile int state:同步状态(The synchronization state)(Exclusive和Share两种状态,分别来表明是独占的,还是共享的) private transient volatile Node h

进击的Coder*的博客 401

视源CVTE嵌入式面试题及参考答案(200+面试题,17万字)

内核模块如何设置? 内核模块是可在运行时动态加载到内核或从内核卸载的代码块。以下是设置内核模块的步骤: 首先,编写内核模块代码。通常使用 C 语言编写,包含必要的头文件,如<linux/init.h>、<linux/module.h>等。在代码中,需要定义模块的初始化函数和清理函数。初始化函数在模块加载时被调用,用于进行模块的初始化工作,如注册设备、分配资源等。清理函数在模块卸载时被调用,用于释放资源、注销设备等。 例如: #include <li

大模型大数据攻城狮的专栏 2205

最新Java 并发编程——AQS 源码学习(1),mysql的存储过程面试题

Java架构进阶面试及知识点文档笔记这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理Java分布式高级面试问题解析文档其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!互联网Java程序员面试必备问题解析及文档学习笔记Java架构进阶视频解析合集本文已被。

2401_84102759的博客 862

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

aqs java_深入浅出学习AQS组件

首先AQS的基本执行过程就是尝试获取锁,成功则返回,如果失败就进入同步队列进行锁资源的等待。基于这个流程可以看出队列跟队列中的节点应该是两个重点。首先来看下AQS里队列节点Node的结构:该类中有五个字段,依次来看一下:1.prev,next:指向它的前置节点跟后继节点,由此看出AQS中的同步队列是个双向链表。2.thread:当前线程对象。3.waitStatus:当前节点的状态,是个int类型...

weixin_39787792的博客 160

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java并发——AQS源码解析

本文通过总结源码学习,来分析了解下AQS的工作原理 AQS是juc包锁实现的基础框架,研究juc包源码之前,AQS是必经之路 虽然说,平时项目中,我们几乎不会有自己去继承aqs实现锁的需要,但是通过源码了解aqs的机制和原理,有助于我们加深对各种锁的理解,以及出现问题时排查的思路 AbstractQueuedSynchronizer抽象队列同步器,CLH 锁 The wait queue is...

醉后不知天在水,满船清梦压星河 661

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

JAVA | 并发 之 AQS

关于AQS–简单的认识

子墨将的博客 319

学习笔记——手撕AQS

这版代码有两个问题,第一,当某一个线程持有锁后,flag变为true,其他想要获取锁的线程只能在lock()中不停的循环,很消耗CPU;第二,线程A获取锁后,线程B也能解锁,也就是无法保证锁的对称性,即加锁解锁是同一个线程。版本1 要实现lock()和unlock()两个方法,需求是线程调用lock()获取锁,未获取到锁就阻塞在lock()中,采用原子变量AtomicBoolean+CAS实现,unlock()同理。跟着视频学完了AQS相关内容,写点笔记记录一下,把输入的内容消化输出一下。

ycr818的博客 220

JUC之AQS必知必会,这样说就够了,成功入职阿里

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》PDF完整版点击这里免费领取》PDF完整版点击这里免费领取**[外链图片转存中…(img-7Dpo0mzd-1712167588406)][外链图片转存中…(img-ZOzN0JHZ-1712167588406)]

sgegv的博客 1162

AQS原理解析及源码分析_aqs 原 理 了 解 么 aqs 组 件 有 哪 些

1.2 同步队列,同一个时间只会有一个线程去操作共享资源,其他未竞争到的线程就进入维护到一个同步队列,该队列由NODE节点维护,在后面我在详细的介绍1.3 等待队列 condition 如果上述的同步队列的线程是等待的(有序或者无序即公平锁和非公平锁的实现)去获取锁,那么等待队列便是通过await和single等待和唤醒功能去加入到同步队列去获取锁。如果一直在等待队列不被唤醒。那么一直不会获取到锁之前。

2401_83620690的博客 388

AQS学习笔记

AQS 学习 文章目录AQS 学习lock加锁过程acquire方法tryAcquire方法hasQueuedPredecessors方法enq方法compareAndSetTail方法addWaiter方法acquireQueued方法shouldParkAfterFailedAcquire方法parkAndCheckInterrupt方法关于加锁的流程图unlock解锁过程release方法t...

yiqzq的博客 789

Java同步器——AQS学习

AQS 阅读原文请访问我的博客BrightLoong's Blog 一. 概述 AQS(AbstractQueuedSynchronizer),队列同步器,Java中很多同步类都是基于AQS实现的,比如:ReentrantLock、Semaphore、CountDownLatch等。 AQS提供了一个实现阻塞锁和相关同步组件的框架,这个框架实现...

brightloong的博客 394

AQS初探-Node

AQS有一个静态内部类Node,即CHL队列中的节点对象,对象中包含了前驱节点,后驱节点,等待节点的后续节点,等待获取同步状态的线程引用、等待状态。 int waitStatus: 1、CANCELLED :值为1,当线程等待超时或者被中断,则取消等待,设等待状态为-1,进入取消状态则不再变化。 2、SIGNAL :值为-1。后继节点处于等待状态,当前节点(为-1)被取消或者中断时会通知后继节点,...

开始写bug~~~ 2406

【JUC】三十、什么是AQS

AQS,即AbstractQueuedSynchronizer,抽象的队列同步器。AQS是JUC的基石,好比JVM之于Java。AQS是用来实现锁或者其它同步器组件的公共基础部分的抽象实现, 是重量级基础框架及整个JUC体系的基石,主要用于解决锁分配给"谁"的问题。AbstractOwnableSynchronizer(下面两兄弟的父类)AbstractQueuedSynchronizer:简称AQS,since1.5三者都是抽象类。

llg___的博客 1776

面试题:了解Java的AQS吗?

前言java.util.concurrent包(之后简称JUC包)中,提供了大量的同步与并发的工具类,是多线程编程的“利器”。其中locks包下,包含了多种锁,如Reen...

IT技术精选文摘 1万+

AQS详解

if (!/*** 中断当前线程*/调用自定义同步器的tryAcquire()尝试直接去获取资源,如果成功则直接返回没成功,则addWaiter将该线程加入等待队列的尾部,并标记为独占模式acquireQueue()使线程在等待队列中休息,有机会时(轮到自己,会被unpark())会尝试获取资源。获取到资源后才返回。如果在整个等待过程中被中断过,则返回true,否则返回false。如果线程在等待过程中被中断过,它是不响应的。

goat的博客 1466
上一篇: ThreadLoacl、InheritableThreadLocal学习
下一篇: Condition学习
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值