返回顶部
首页 > 资讯 > 后端开发 > 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://lsjlt.com/news/392509.html(转载时请注明来源链接)

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

猜你喜欢
  • 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 容器
  • Android学习(小知识点)
    Android学习(小知识点) 一、欢迎使用界面 二、隐藏标题栏和状态栏+自定义标题栏 三、Butter+EditText模板 四、Scrol...
    99+
    2022-06-06
    android学习 Android
  • mysql基础知识学习
     1      说明数据库的命令时不区分大小写的,例如“CREATE DATABASE test”与“create database t...
    99+
    2024-04-02
  • 学习nginx基础知识
    目录一.什么是nginx?二.nginx能干什么?2.1 什么是正向代理?2.2 什么是反向代理?2.3负载均衡2.4 动静分离三.nginx基本操作3.1 nginx配置文...
    99+
    2024-04-02
  • Python 基础知识学习
    1、Python 基础教程      Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。2、执行Python程序     实例(Python 2.0+)     print "Hello, World!";  3、环境搭建...
    99+
    2023-01-31
    基础知识 Python
  • java正则知识详解
    表达式意义:(推荐:java视频教程)字符x 字符 x。例如a表示字符a\ 反斜线字符。在书写时要写为\\。(注意:因为java在第一次解析时,把\\解析成正则表达式\,在第二次解析时再解析为,所以凡是不是1.1列举到的转义字符,包括1.1...
    99+
    2021-10-02
    java
  • 详解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冷知识:javac AbstractProcessor详解
    目录它可以做什么?ProcessorAbstractProcessor源码google的 auto-servicejavapoet你喜欢的lombok实现原理是怎样的呢?它可以做什么...
    99+
    2024-04-02
  • 详解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
  • Python解析json文件相关知识学习
    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1...
    99+
    2022-06-04
    相关知识 文件 Python
  • Go语言学习:必备知识点解析
    Go语言学习:必备知识点解析 Go语言是一种由Google开发的开源编程语言,具有简洁、高效、并发等特点,被广泛应用于大型系统开发、云计算、区块链等领域。对于想要学习Go语言的人来说,...
    99+
    2024-02-22
    基础知识 语法规则 应用实践 go语言 区块链
  • Go语言学习指南:必备技能与知识点详解
    【Go语言学习指南:必备技能与知识点详解】 Go语言是一种由Google开发的开源编程语言,其简洁的语法和高效的并发特性使其在云计算和分布式系统开发领域广受欢迎。本文将为您介绍学习Go...
    99+
    2024-03-04
    技能 学习 go语言
  • Redis学习笔记:基础知识
        一、NoSQL和关系型数据库区别     NoSQL非关系型数据库:Redis、MongoDB、HBase等,基于Key-Value存储,采用命令操作。     关系型数据库:Oracle、MySQL、DB2、SQL Se...
    99+
    2020-08-16
    Redis学习笔记:基础知识
  • 快速学习MySQL基础知识
    这篇文章主要梳理了 SQL 的基础用法,会涉及到以下方面内容: SQL大小写的规范 数据库的类型以及适用场景 SELECT 的执行过程 WHERE 使用规范 MySQL 中常见函...
    99+
    2022-05-26
    学习MySQL MySQL 基础
  • 掌握学习mysql相关知识
    下面一起来了解下mysql相关知识,相信大家看完肯定会受益匪浅,文字在精不在多,希望mysql相关知识这篇短内容是你想要的。一、连接MySQL       格式: m...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作