当前位置: 首页 > news >正文

JAVA并发——什么是AQS?

AQS 就是起到了一个抽象、封装的作用,将一些排队、入队、加锁、中断等方法提供出来,便于其他相关 JUC 锁的使用,具体加锁时机、入队时机等都需要实现类自己控制。

它主要解决三个问题

  • 多线程竞争资源时,如何让线程 有序排队
  • 被阻塞的线程,如何 高效挂起/唤醒
  • 如何实现“共享/独占”式访问控制?

核心组成结构:
AQS

├─ state:共享资源状态(volatile int,0/1等)
├─ CLH 队列:双向链表,线程排队用
│ └─ Node(head -> node1 -> node2 -> … -> tail)
├─ CAS + LockSupport:实现线程安全和挂起唤醒
├─ 模板方法: tryAcquire/tryRelease/tryAcquireShared/…

它主要通过维护一个共享状态(state)和一个先进先出(FIFO)的等待队列,来管理线程对共享资源的访问。

state 用 volatile 修饰,表示当前资源的状态。例如,在独占锁中,state 为0表示未被占用,为1表示已被占用。

当线程尝试获取资源失败时,会被加入到 AQS 的等待队列中。这个队列是一个变体的 CLH 队列,采用双向链表结构,节点包含线程的引用、等待状态以及前驱和后继节点的指针。

工作原理(流程图级别)
以“独占锁”为例(如 ReentrantLock)

线程A想抢锁 -> 调用 tryAcquire()
↳ 成功?✔:直接拿到锁
↳ 失败?✘:入队排队(CLH 队列)+ 挂起(LockSupport.park)

线程B释放锁 -> 调用 release()
↳ 修改 state 状态
↳ 唤醒队列中的下一个等待线程(LockSupport.unpark)

http://www.dtcms.com/a/278068.html

相关文章:

  • Mapbox GL初探
  • 【unitrix】 5.0 第二套类型级二进制数基本结构体(types2.rs)
  • 16.使用ResNet网络进行Fashion-Mnist分类
  • css如何同时给元素设置背景和背景图?
  • 每日算法刷题Day47:7.13:leetcode 复习完滑动窗口一章,用时2h30min
  • 说实话,统计分析用Python这5个第三方库就够了
  • AutoLabor-ROS-Python 学习记录——第一章 ROS概述与环境搭建
  • PortsSwiggerLab: SSRF with blacklist-based input filter
  • JS进阶-day1 作用域解构箭头函数
  • Spring AI 项目实战(十六):Spring Boot + AI + 通义万相图像生成工具全栈项目实战(附完整源码)
  • NO.5数据结构串和KMP算法|字符串匹配|主串与模式串|KMP|失配分析|next表
  • pthread_mutex_unlock函数的概念和用法
  • 大规模电商系统分库分表实战经验分享
  • NFSV4锁机制(三)
  • 编程技术杂谈2.0
  • DVWA靶场通关笔记-XSS DOM(High级别)
  • 垃圾收集器-Serial Old
  • CVE-2022-0609
  • vue2入门(1)vue核心语法详解复习笔记
  • 【开源项目】网络诊断告别命令行!NetSonar:开源多协议网络诊断利器
  • 1.1.1+1.1.3 操作系统的概念、功能
  • c++无锁队列moodycamel::ConcurrentQueue测试结果
  • 在高并发场景下,仅依赖数据库机制(如行锁、版本控制)无法完全避免数据异常的问题
  • Sping AI Alibaba
  • 第11章 AB实验评估指标体系
  • Soul方程式:Z世代背景下兴趣社交平台的商业模式解析
  • Java行业前景如何?零基础又该如何去学Java?
  • 深入理解 RocketMQ:生产者详解
  • 并行并发丨C++ 协程、现场池 学习笔记
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十三课——图像浮雕效果的FPGA实现