首页 > 编程语言 >Java并发之AQS

Java并发之AQS

时间:2023-10-13 13:01:33浏览次数:49  
标签:Java AQS 获取 队列 并发 线程 CLH 节点

一、AQS是什么

AbstractQueuedSynchronizer 抽象同步队列,简称 AQS ,它是Java并发包的根基,并发包中的锁就是基于AQS实现的。

AQS是基于一个FIFO的双向队列,其内部定义了一个节点类Node,Node 节点内部的 SHARED 用来标记该线程是获取共享资源时被阻挂起后放入AQS 队列的,EXCLUSIVE 用来标记线程是 取独占资源时被挂起后放入AQS 队列

AQS 使用一个 volatile 修饰的 int 类型的成员变量 state 来表示同步状态,修改同步状态成功即为获得锁,volatile 保证了变量在多线程之间的可见性,修改 State值时通过 CAS 机制来保证修改的原子性

获取state的方式分为两种,独占方式和共享方式,一个线程使用独占方式获取了资源,其它线程就会在获取失败后被阻塞。一个线程使用共享方式获取了资源,另外一个线程还可以通过CAS的方式进行获取。

如果共享资源被占用,需要一定的阻塞等待唤醒机制来保证锁的分配,AQS 中会将竞争共享资源失败的线程添加到一个变体的 CLH 队列中。

Java并发之AQS_Java

先简单了解一下CLH:Craig、Landin and Hagersten 队列,是 单向链表实现的队列。申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现 前驱节点释放了锁就结束自旋。

Java并发之AQS_可见性_02

AQS 中的队列是 CLH 变体的虚拟双向队列,通过将每条请求共享资源的线程封装成一个节点来实现锁的分配:

Java并发之AQS_可见性_03

AQS 中的 CLH 变体等待队列拥有以下特性:

AQS 中队列是个双向链表,也是 FIFO 先进先出的特性通过 Head、Tail 头尾两个节点来组成队列结构,通过 volatile 修饰保证可见性。

Head 指向节点为已获得锁的节点,是一个虚拟节点,节点本身不持有具体线程获取不到同步状态,会将节点进行自旋获取锁,自旋一定次数失败后会将线程阻塞,相对于 CLH 队列性能较好。

标签:Java,AQS,获取,队列,并发,线程,CLH,节点
From: https://blog.51cto.com/u_16269508/7844130

相关文章

  • 高并发场景下的 HttpClient 优化方案,QPS 大大提升!
    HttpClient优化思路:池化长连接httpclient和httpget复用合理的配置参数(最大并发请求数,各种超时时间,重试次数)异步多读源码1.背景我们有个业务,会调用其他部门提供的一个基于http的服务,日调用量在千万级别。使用了httpclient来完成业务。之前因为qps上不去,就看了一下业务代......
  • Java内存模型-JMM
    内存模型与内存区域 很多时候,二者会混淆,所以咱们先做区分:内存模型与内存区域内存区域是指JVM运行时将数据分区域存储,强调的是对空间的分配内存模型(JMM)是定义了线程和主内存之间的抽象关系。即定义了JVM在计算机内存中的工作方式内存模型抽象关系定义线程之间的共享区......
  • java学习日记day02
    java学习日记day02冯诺伊曼体系)cmd指令......
  • Java8新特性之Optional容器(七)
    1.Optional介绍Optional是Java8提供的一个容器对象,可以包含一个为null或者不为null的对象;使用该对象可以更方便的避免项目中的NPE,在新版的SpringDataJPA中已经实现了对该类的支持;注意该类是被final修饰的,同时没有实现任何接口;publicfinalclassOptional<T>{pri......
  • java框架中的controller层、dao层、domain层、service层、view层【转】
      1.Controller层:接口层,用户访问请求时对接。  Controller层负责具体的业务模块流程的控制,在此层里面要调用Serice层的接口来控制业务流程,控制的配置也同样是在Spring的配置文件里面进行,针对具体的业务流程,会有不同的控制器,我们具体的设计过程中可以将流程进行抽象归......
  • 【Java】用户在线人数统计的简单实现
    一、需求效果:就是进入首页时能查看在线人数,没有特定要求,那我就不刷这个接口了就进入首页加载一次 二、实现思路:思路参考博客:https://blog.csdn.net/GitLuckyd/article/details/124488063如果是以前那种JSP的单体项目,可以用Servlet的监听器API来做但是不管是Servlet还......
  • Java也能做OCR!SpringBoot 整合 Tess4J 实现图片文字识别
    前言今天给大家分享一个SpringBoot整合Tess4j库实现图片文字识别的小案例,希望xdm喜欢。文末有案例代码的Git地址,可以自己下载了去玩玩儿或继续扩展也行。话不多说,开整吧。什么是Tess4j库先简单给没听过的xdm解释下,这里要分清楚Tesseract和Tess4j的区别。Tesseract是一个......
  • 「Java开发指南」如何在MyEclipse中使用JPA和Spring管理事务?(一)
    本教程中介绍一些基于JPA/spring的特性,重点介绍JPA-Spring集成以及如何利用这些功能。您将学习如何:为JPA和Spring设置一个项目逆向工程数据库表来生成实体实现创建、检索、编辑和删除功能启用容器管理的事务MyEclipsev2023.1.2离线版下载MyEclipse技术交流群:742336981......
  • 打造炫酷效果:用Java优雅地制作Excel迷你图
    摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。前言迷你图是一种简洁而有效的数据可视化方式,常用于展示趋势和变化。它通常由一组小型的线条或柱状图组成,用于表示数据的变化情况。迷你图的主要......
  • 【开源】给ChatGLM写个,Java对接的SDK
    作者:小傅哥-百度搜小傅哥bugstack博客:bugstack.cn沉淀、分享、成长,让自己和他人都能有所收获!......