iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java知识学习13(AQS详解)
  • 510
分享到

Java知识学习13(AQS详解)

java 2023-09-03 17:09:47 510人浏览 独家记忆
摘要

1、AQS介绍? AQS 的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。

1、AQS介绍?

AQS 的全称为 AbstractQueuedSynchronizer翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。

AQS 就是一个抽象类,主要用来构建锁和同步器

public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable {}

AQS 为构建和同步器提供了一些通用功能的实现,因此,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的 ReentrantLockSemaphore,其他的诸如 ReentrantReadWriteLockSynchronousQueue等等皆是基于 AQS 的。

2、AQS 原理?

AQS 核心思想AQS 核心思想是: 如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制 AQS 是基于 CLH 锁 (Craig, Landin, and Hagersten locks) 实现的。

CLH 锁是对自旋锁的一种改进,是一个虚拟的双向队列加粗样式(虚拟的双向队列即不存在队列实例,仅存在结点之间的关联关系),暂时获取不到锁的线程将被加入到该队列中。AQS 将每条请求共享资源的线程封装成一个 CLH 队列锁的一个结点(node)来实现锁的分配。在 CLH 队列锁中,一个节点表示一个线程,它保存着线程的引用(thread)、 当前节点在队列中的状态(waitStatus)、前驱节点(prev)、后继节点(next)。

CLH 队列锁结构如下图所示:

在这里插入图片描述

AQS(AbstractQueuedSynchronizer)的核心原理图:
在这里插入图片描述

AQS 使用 int 成员变量 state 表示同步状态,通过内置的 线程等待队列 来完成获取资源线程的排队工作。

state 变量由 volatile 修饰,用于展示当前临界资源的获锁情况。

// 共享变量,使用volatile修饰保证线程可见性private volatile int state;

另外,状态信息 state 可以通过 protected 类型的getState()、setState()compareAndSetState() 进行操作。并且,这几个方法都是 final 修饰的,在子类中无法被重写

//返回同步状态的当前值protected final int getState() {     return state;} // 设置同步状态的值protected final void setState(int newState) {     state = newState;}//原子地(CAS操作)将同步状态值设置为给定值update如果当前同步状态的值等于expect(期望值)protected final boolean compareAndSetState(int expect, int update) {      return unsafe.compareAndSwapint(this, stateOffset, expect, update);}

ReentrantLock 为例,state 初始值为 0,表示未锁定状态。A 线程 lock() 时,会调用 tryAcquire() 独占该锁并将 state+1 。此后,其他线程再 tryAcquire() 时就会失败,直到 A 线程 unlock()state=0(即释放锁)为止,其它线程才有机会获取该锁。

当然,释放锁之前,A 线程自己是可以重复获取此锁的state 会累加),这就是可重入的概念。但要注意,获取多少次就要释放多少次,这样才能保证 state 是能回到零态的。

再以 CountDownLatch 以例,任务分为 N 个子线程去执行,state 也初始化为 N(注意 N 要与线程个数一致)。这 N 个子线程是并行执行的,每个子线程执行完后countDown() 一次,stateCAS(Compare and Swap) 减 1。等到所有子线程都执行完后(即 state=0 ),会 unpark() 主调用线程,然后主调用线程就会从 await() 函数返回,继续后余动作。

来源地址:https://blog.csdn.net/ldy007714/article/details/130329915

--结束END--

本文标题: Java知识学习13(AQS详解)

本文链接: https://www.lsjlt.com/news/392509.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java知识学习13(AQS详解)
    1、AQS介绍? AQS 的全称为 AbstractQueuedSynchronizer ,翻译过来的意思就是抽象队列同步器。这个类在 java.util.concurrent.locks 包下面。 ...
    99+
    2023-09-03
    java
  • Java学习笔记必备:Linux容器知识详解
    随着Java技术的不断发展,越来越多的开发者开始使用Java进行应用程序的开发。在Java的学习过程中,了解Linux容器知识是非常重要的。本文将详细介绍Linux容器的相关知识,并提供一些演示代码供参考。 一、什么是Linux容器? L...
    99+
    2023-11-07
    学习笔记 linux 容器
  • Python 基础知识学习
    1、Python 基础教程      Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。2、执行Python程序     实例(Python 2.0+)     print "Hello, World!";  3、环境搭建...
    99+
    2023-01-31
    基础知识 Python
  • 学习nginx基础知识
    目录一.什么是nginx?二.nginx能干什么?2.1 什么是正向代理?2.2 什么是反向代理?2.3负载均衡2.4 动静分离三.nginx基本操作3.1 nginx配置文...
    99+
    2024-04-02
  • 详解Java注解知识点
    目录一、注解是什么二、jdk支持的注解有哪些2.1 三种常用的注解:2.2 元注解三、注解实例四、总结一、注解是什么 Java 注解用于为 Java 代码提供元数据,看完这句话也许你...
    99+
    2024-04-02
  • python3学习知识点笔记
    class Class_name(object): # 声明类Class_name,继承自objectclass Class_name: #不显示继承自object,创建类Class_nameclass Fruit: #创建水果类     ...
    99+
    2023-01-31
    知识点 笔记
  • Java基础学习之字符串知识总结
    目录一、前言二、String 类(字符串常量)2.1 String 类实例的创建2.2 String 对象的比较2.3 String对象的空值2.4 字符串拼接三、StringBui...
    99+
    2024-04-02
  • Java性能调优必备知识学习路线
    性能调优是Java开发中一个非常重要的环节,它可以帮助我们提高系统的性能、稳定性、可靠性和用户体验,从而提高用户体验和企业竞争力。  目录 一、为什么要学习Java性能调优? 二、如何做好性能调优? 2.1 扎实的计算机基础 2.2 ...
    99+
    2023-10-07
    java 性能优化 学习 后端
  • 详解Java进阶知识注解
    目录一、注解的概念1、注解官方解释2、注解与注释的区别二、内置注解与元注解1、常用的内置注解2、常用的元注解三、自定义注解1、自定义注解基础知识2、演示自定义注解的使用3、演示注解在...
    99+
    2024-04-02
  • 详解java注解相关知识
    定义  1、如果注解中有属性,那么必须给属性赋值。 package com.lxc.Test; // 定义一个注解 public @interface Annota...
    99+
    2024-04-02
  • java冷知识:javac AbstractProcessor详解
    目录它可以做什么?ProcessorAbstractProcessor源码google的 auto-servicejavapoet你喜欢的lombok实现原理是怎样的呢?它可以做什么...
    99+
    2024-04-02
  • Go语言学习:必备知识点解析
    Go语言学习:必备知识点解析 Go语言是一种由Google开发的开源编程语言,具有简洁、高效、并发等特点,被广泛应用于大型系统开发、云计算、区块链等领域。对于想要学习Go语言的人来说,...
    99+
    2024-02-22
    基础知识 语法规则 应用实践 go语言 区块链
  • Go语言学习指南:必备技能与知识点详解
    【Go语言学习指南:必备技能与知识点详解】 Go语言是一种由Google开发的开源编程语言,其简洁的语法和高效的并发特性使其在云计算和分布式系统开发领域广受欢迎。本文将为您介绍学习Go...
    99+
    2024-03-04
    技能 学习 go语言
  • JavaScript学习知识点有哪些
    这篇文章主要为大家展示了“JavaScript学习知识点有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript学习知识点有哪些”这篇文章吧。一...
    99+
    2024-04-02
  • Python全栈学习_day002知识点
    今日大纲: 1. while循环 2. 格式化输出 3. 运算符 4. 编码初识   1. while循环 - while 无限循环: while True: # 死循环 print('大悲咒...
    99+
    2023-01-30
    知识点 Python
  • Python全栈学习_day003知识点
    今日大纲: 1. 基础数据类型 总览 2. int 3. bool 4. str 5. for循环   1. 基础数据类型 总览   int: 用于计算,计数等 str:'这些内容',用户少量数据的存储,便于操作 ...
    99+
    2023-01-30
    知识点 Python
  • Python全栈学习_day001知识点
    今日大纲: 1. 变量。 ***** 2. 常量。** 3. 注释。*** 4. 基础数据类型初识(int,str,bool). ***** 5. 用户输入 input ***** 6. 流程控制语句if。 ***** 1. 变量编码...
    99+
    2023-01-30
    知识点 Python
  • Python全栈学习_day009知识点
    今日大纲: 1. 函数的初识 2. 函数的返回值 3. 函数的参数   1. 函数的初识 统计字符串s的总个数(不能用len) s='fkahfkahofijalkfkadhfkjadhf' count = 0 for i i...
    99+
    2023-01-30
    知识点 Python
  • 学科知识图谱学习平台项目 :技术栈Java、Neo4j、MySQL等超详细教学
    项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用...
    99+
    2023-09-04
    知识图谱 java 深度学习 人工智能 自然语言处理 原力计划
  • 【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引
    前言 自学Java怎么学,找对方向很关键!在这里为大家分享最全的架构师级Java全栈学习路线及知识清单! 包含JavaSE基础,JavaWeb,SSM框架,Linux运维,分布式与微服务,大数据开发~ 本人研究人生一枚,自学Java中,后...
    99+
    2023-08-17
    java 学习
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作