Java并发编程-AQS详解及案例实战(上篇)

文章目录

  • AQS概述
      • AQS 的核心概念
      • AQS 的工作原理
      • AQS 的灵活性
      • 使用场景
  • AQS的本质:为啥叫做异步队列同步器
      • AQS的核心机制
      • “异步队列”的含义
      • “同步器”的含义
      • 总结
  • 加锁失败的时候如何借助AQS异步入队阻塞等待
      • AQS的锁队列
      • 加锁失败时的处理流程
      • 异步入队的机制
      • 总结
  • ReentractLock如何设置公平锁策略以及原理
      • 设置公平锁策略
      • 公平锁的运作原理
        • 尝试获取锁
        • 释放锁
      • 性能与公平性的权衡
  • tryLock如何实现加锁等待一段时间过后放弃
      • tryLock的基本用法
      • tryLock的实现原理
      • 实现示例
      • 总结
  • ReentractLock底层如何实现
      • ReentrantLock的实现原理
      • ReentrantLock与AQS的关系
  • 用第三个线程尝试加锁失败彻底图解AQS队列等待机制
      • 场景设定
      • Thread C尝试获取锁
      • Thread C加入等待队列
      • Thread C被阻塞
      • 图解
      • 总结
  • AQS默认的非公平加锁策略的运作原理
      • 非公平锁的运作原理
        • 尝试获取锁
        • 重新获取锁
        • 等待队列中的线程
      • 总结
  • 服务注册中心的最近更新服务实例队列实现
      • 设计思路
      • 实现示例
      • 注意事项
  • 服务注册中心提供全量和增量拉取注册表的接口
      • 全量拉取
        • 实现思路:
        • 示例代码(使用Spring Boot):
      • 增量拉取
        • 实现思路:
        • 示例代码(使用Spring Boot):
      • 注意事项
  • 客户端实现启动时拉取全量注册表
      • 步骤 1: 添加依赖
      • 步骤 2: 创建配置类
      • 步骤 3: 实现全量拉取逻辑
      • 步骤 4: 在启动时执行全量拉取
      • 注意事项
  • 案例实战:客户端实现定时拉取增量注册表到本地合并
      • 业务需求
      • 使用AQS设计定时任务
      • 实现步骤
      • 代码示例
      • 注意事项
  • 案例实战:增量合并注册表后进行校验与全量纠正
      • 业务需求
      • AQS辅助设计
      • 实现步骤
      • 代码示例
      • 注意事项
  • AQS如何基于无锁化的CAS机制实现高性能的加锁
      • CAS机制
      • AQS中的CAS应用
        • 获取锁
        • 释放锁
      • 无锁化的优势
  • 如何巧妙的借助AQS中的state变量实现可重入式加锁
      • 可重入锁的基本原理
      • 利用AQS实现可重入锁
      • 示例代码
  • 基于AQS实现的可重入锁释放过程的源码剖析
      • AQS中的锁释放逻辑
      • ReentrantLock的`unlock`方法
      • AQS的`release`方法
      • AQS的`tryRelease`方法
      • 唤醒等待线程
      • 总结
  • 锁释放过后如何对AQS队列中唤醒阻塞线程尝试抢占锁
      • AQS的唤醒机制
      • 唤醒等待线程
      • `unparkSuccessor`方法详解
      • 尝试抢占锁
      • 总结
  • 一种新奇的加锁玩法:读锁和写锁分开是怎么玩的
      • 读写锁的原理
      • 使用场景
      • Java中的读写锁实现
      • 总结
  • 读写锁中的写锁是如何基于AQS的state变量完成加锁的
      • AQS的`state`变量
      • 写锁加锁过程
      • 代码示例
      • 总结
  • 基于AQS的state二进制高低16位判断实现写锁的可重入加锁
      • `state`变量的位分配
      • 写锁的可重入加锁
      • 代码实现
      • 总结
  • 写锁加锁失败时如何基于AQS队列完成入队阻塞等待?
      • 尝试获取写锁
      • 加锁失败后的处理
      • 加入AQS队列
      • 阻塞线程
      • 监听锁状态变化
      • 队列中的线程唤醒
      • 总结
  • 读写锁互斥:基于AQS的state二进制高低16位完成互斥判断
      • `state`变量的位分配
      • 互斥判断
      • 代码示例
      • 互斥性的保证
      • 总结

AQS概述

AQS,全称 AbstractQueuedSynchronizer,是 Java 并发包 java.util.concurrent.locks 中的一个抽象类,它为实现依赖于先进先出(FIFO)等待队列的阻塞锁和其他同步器提供了基础框架。AQS 是 Java 内置锁和大部分并发工具类(如 ReentrantLock, Semaphore, CountDownLatch 等)的基础,通过它我们可以理解 Java 高级并发工具的内部工作原理。

AQS 的核心概念

  1. 独占式与共享式同步

    • 独占式:一次只有一个线程可以获取同步状态,如 ReentrantLock。
    • 共享式:多个线程可以同时获取同步状态,如 Semaphore。
  2. 状态管理

    • AQS 使用一个 int 成员变量来表示同步状态,通过内置的 Unsafe 类的原子操作方法来修改这个状态,保证线程安全。
  3. CLH 锁队列

    • CLH(Craig-Landin-Hagersten)队列是一种高性能的非阻塞队列,AQS 使用 CLH 锁队列来管理等待线程,当线程尝试获取锁而未能成功时,会被加入到队列中。

AQS 的工作原

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/867477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

雨量监测站:守护大地的晴雨表

雨量监测站是一种专门用于测量和记录降雨量的设施。它通常由雨量计、数据采集器、传输装置和数据处理系统组成。雨量计负责感应雨滴的接触,通过一定的机制将降雨量转化为电信号或数字信号。数据采集器则负责收集这些信号,并将其传输至数据处理系统进行分…

FastAPI+vue3+Primeflex教学20240706,渲染阶乘案例

子绝父相 相对定位是相对于自己原本的位置定位。 绝对定位,如果父元素设置了相对定位,则相对于父元素进行绝对定位,否则相对于最近的设置了相对定位的元素进行绝对定位,或者相对于根元素进行绝对定位。 定位有四个方向&#xff0…

38 IO流

目录 C语言的输入和输出流是什么CIO流stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输出方式是scanf和printf,scanf:从标准输入设备(键盘)读取数据,并将值存在变量中。printf:…

高级计算机体系结构--期末教材复习

Chap2 性能评测和并行编程性能评测并行编程为什么需要三次 barrier改进方法 Chap3 互连网络交换和路由二维网格中 XY 路由 死锁、活锁及饿死死锁避免的方法:虚通道、转弯模型二维网格中最小 西向优先、北向最后和负向优先算法转弯模型:超立方体的部分自适…

安装 tesseract

安装 tesseract 1. Ubuntu-24.04 安装 tesseract2. Ubuntu-24.04 安装支持语言3. Windows 安装 tesseract4. Oracle Linux 8 安装 tesseract 1. Ubuntu-24.04 安装 tesseract sudo apt install tesseract-ocr sudo apt install libtesseract-devreference: https://tesseract-…

绝区贰--及时优化降低 LLM 成本和延迟

前言 大型语言模型 (LLM) 为各行各业带来了变革性功能,让用户能够利用尖端的自然语言处理技术处理各种应用。然而,这些强大的 AI 系统的便利性是有代价的 — 确实如此。随着 LLM 变得越来越普及,其计算成本和延迟可能会迅速增加,…

ctfshow web 36d 练手赛

不知所措.jpg 没啥用然后测试了网站可以使用php伪达到目的 ?filephp://filter/convert.base64-encode/resourcetest/../index.<?php error_reporting(0); $file$_GET[file]; $file$file.php; echo $file."<br />"; if(preg_match(/test/is,$file)){inclu…

如何处理 PostgreSQL 中由于表连接顺序不当导致的性能问题?

文章目录 一、理解表连接和连接顺序二、识别由于表连接顺序不当导致的性能问题三、影响表连接顺序的因素四、解决方案手动调整连接顺序创建合适的索引分析数据分布和优化查询逻辑 五、示例分析手动调整连接顺序创建索引优化查询逻辑 六、总结 在 PostgreSQL 中&#xff0c;表连…

论文回顾 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法

论文速览 | CVPR 2021 | How to Calibrate Your Event Camera | 基于图像重建的事件相机校准新方法 1 引言 在计算机视觉和机器人领域,相机校准一直是一个基础而又重要的问题。传统的相机校准方法主要依赖于从已知校准图案中提取角点,然后通过优化算法求解相机的内参和外参。这…

Vue表单输入绑定v-model

表单输入绑定 在前端处理表单时&#xff0c;我们常常需要将表单输入框的内容同步给Javascript中相应的变量。手动连接绑定和更改事件监听器可能会很麻&#xff0c;v-model 指令帮我们简化了这一步骤。 <template><h3>表单输入绑定</h3><hr> <inpu…

Ubuntu基本环境配置

#Jdk 安装 #--查看 已安装 的jdk软件 java -version # 安装jdk软件(如果有选择请选 y) sudo apt install openjdk-11-jdk # 自行学习 vi 或 vim 学习网址如下&#xff1a; # https://www.runoob.com/linux/linux-vim.html #-- 修改系统级 path : /etc/profile 文件 (注意要…

ElasticSearch 如何计算得分及一个不太成熟的使用

1.背景 最近在做 ES 相关东西&#xff0c;只最会在查询的时候给不同的字段设置不同的权重&#xff0c;但是得分具体怎么算的不太明白&#xff0c;花了4-5 天研究和总结了一下。这样不至于被别人问到“这个分数怎么算出来的&#xff1f;”&#xff0c;两眼一抹黑&#xff0c;不…

【vue组件库搭建05】vitePress中使用vue/antd/demo预览组件

一、vitepress使用vue及antd组件 1.安装antd之后在docs\.vitepress\theme\index.ts引入文件 // https://vitepress.dev/guide/custom-theme import { h } from vue import type { Theme } from vitepress import DefaultTheme from vitepress/theme import ./style.css impor…

Vue进阶(四十五)Jest集成指南

文章目录 一、前言二、环境检测三、集成问题汇总四、拓展阅读 一、前言 在前期博文《Vue进阶&#xff08;八十八&#xff09;Jest》中&#xff0c;讲解了Jest基本用法及应用示例。一切顺利的话&#xff0c;按照文档集成应用即可&#xff0c;但是集成过程中遇到的问题可能五花八…

基于Java的网上花店系统

目 录 1 网上花店商品销售网站概述 1.1 课题简介 1.2 设计目的 1.3 系统开发所采用的技术 1.4 系统功能模块 2 数据库设计 2.1 建立的数据库名称 2.2 所使用的表 3 网上花店商品销售网站设计与实现 1. 用户注册模块 2. 用户登录模块 3. 鲜花列表模块 4. 用户购物车…

【ARMv8/v9 GIC 系列 1.5 -- Enabling the distribution of interrupts】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Enabling the distribution of interruptsGIC Distributor 中断组分发控制CPU Interface 中断组分发控制Physical LPIs 的启用Summary Enabling the distribution of interrupts 在ARM GICv3和GICv4体系结构中&#xff0c;中断分发…

Windows上Docker的安装与初体验

Docker Desktop下载地址 国内下载地址 一、基本使用 1. 运行官方体验镜像 docker run -d -p 80:80 docker/getting-started执行成功 停止体验服务 docker stop docker/getting-started删除体验镜像 docker rmi docker/getting-started2. 修改docker镜像的存储位置 3. …

Django开发实战(1)- 认识django

1.django 使用MTV模式&#xff0c;其实与MVC本质一样&#xff1a; model&#xff1a;业务对象和关系映射&#xff08;ORM&#xff09; template&#xff1a;客户端页面展示 view&#xff1a;业务逻辑&#xff0c;根据需求调用 2.开发相关 √ python √ html&…

简单的手动实现spring中的自动装配案例

简简单单的实现一个spring中的自动装配和容器管理的小骚操作。 1&#xff0c;创建AutoSetBean.java 使用injectBeans静态方法&#xff0c;可以扫描指定包下的所有带MyInject注解的字段&#xff0c;如果在beans的Map中存在这个字段的实例化类&#xff0c;则执行装配。 import…

无人机企业需要什么资质?

无人机企业所需的资质主要可以分为几大类&#xff0c;以确保其合法、安全、高效地进行相关业务活动。以下是对这些资质的详细解释和归纳&#xff1a; 1. 基础企业资质&#xff1a; - 工商营业执照&#xff1a;这是企业合法经营的基本证书&#xff0c;所有企业都需要取得。无人…