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 高级并发工具的内部工作原理。
提供一个框架,用于实现依赖先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件等)。此类被设计为大多数类型的同步器的有用基础,这些同步器依赖于单个原子int值来表示状态。子类必须定义更改该状态的受保护方法,以及定义该状态在获取或释放该对象方面的含义。给定这些,类中的其他方法执行所有排队和阻塞机制。子类可以维护其他状态字段,但只跟踪使用方法getState、setState和compareAndSetState操作的原子更新的int值。
子类应定义为非公共内部帮助类,用于实现其封闭类的同步属性。类AbstractQueuedSynchronizer不实现任何同步接口。相反,它定义了诸如Acquisible Interruptible之类的方法,具体锁和相关同步器可以适当地调用这些方法来实现它们的公共方法。
此类支持默认的独占模式和共享模式之一或两者。在独占模式下获取时,其他线程尝试的获取无法成功。多个线程获取共享模式可能(但不一定)成功。这个类不“理解”这些差异,除了在机械意义上,当共享模式获取成功时,下一个等待线程(如果存在)也必须确定它是否也可以获取。在不同
相关文章:
Java并发编程-AQS详解及案例实战(上篇)
文章目录 AQS概述AQS 的核心概念AQS 的工作原理AQS 的灵活性使用场景使用指南使用示例AQS的本质:为啥叫做异步队列同步器AQS的核心机制“异步队列”的含义“同步器”的含义总结加锁失败的时候如何借助AQS异步入队阻塞等待AQS的锁队列加锁失败时的处理流程异步入队的机制总结Ree…...

第11章 规划过程组(二)(11.8排列活动顺序)
第11章 规划过程组(二)11.8排列活动顺序,在第三版教材第391页; 文字图片音频方式 第一个知识点:主要输出 1、项目进度网络图 如图11-20 项目进度网络图示例 带有多个紧前活动的活动代表路径汇聚,而带有…...
DP学习——观察者模式
学而时习之,温故而知新。 敌人出招(使用场景) 多个对象依赖一个对象的状态改变,当业务中有这样的关系时你出什么招? 你出招 这个时候就要用观察者模式这招了! 2个角色 分为啥主题和观察者角色。 我觉…...

如何利用GPT-4o生成有趣的梗图
文章目录 如何利用GPT-4o生成有趣的梗图一、引言二、使用GPT-4o生成梗图1. 提供主题2. 调用工具3. 获取图片实际案例输入输出 三、更多功能1. 创意和灵感2. 梗图知识 四、总结 如何利用GPT-4o生成有趣的梗图 梗图,作为互联网文化的一部分,已经成为了我们…...
深入理解 KVO
在 iOS 中,KVO(Key-Value Observing)是一个强大的观察机制,它的底层实现相对复杂。KVO 利用 Objective-C 的动态特性,为对象的属性提供观察能力。 KVO 的底层实现 1. 动态子类化 当一个对象的属性被添加观察者时&am…...

当需要对大量数据进行排序操作时,怎样优化内存使用和性能?
文章目录 一、选择合适的排序算法1. 快速排序2. 归并排序3. 堆排序 二、数据结构优化1. 使用索引2. 压缩数据3. 分块排序 三、外部排序1. 多路归并排序 四、利用多核和并行计算1. 多线程排序2. 使用并行流 五、性能调优技巧1. 避免不必要的内存复制2. 缓存友好性3. 基准测试和性…...

kubernetes集群部署:node节点部署和cri-docker运行时安装(四)
安装前准备 同《kubernetes集群部署:环境准备及master节点部署(二)》 安装cri-docker 在 Kubernetes 1.20 版本之前,Docker 是 Kubernetes 默认的容器运行时。然而,Kubernetes 社区决定在 Kubernetes 1.20 及以后的…...
第五十章 Web Service URL 汇总
文章目录 第五十章 Web Service URL 汇总Web 服务 URLWeb 服务的端点WSDL 使用受密码保护的 WSDL URL 第五十章 Web Service URL 汇总 本主题总结了与 IRIS 数据平台 Web 服务相关的 URL。 Web 服务 URL 与 IRIS Web 服务相关的 URL 如下: Web 服务的端点 http…...

动态白色小幽灵404网站源码
动态白色小幽灵404网站源码,页面时单页HTML源码,将代码放到空白的html里面,鼠标双击html即可查看效果,或者上传到服务器,错误页重定向这个界面即可,喜欢的朋友可以拿去使用 <!DOCTYPE html> <ht…...

axios的使用,处理请求和响应,axios拦截器
1、axios官网 https://www.axios-http.cn/docs/interceptors 2、安装 npm install axios 3、在onMouunted钩子函数中使用axios来发送请求,接受响应 4.出现的问题: (1) 但是如果发送请求请求时间过长,回出现请求待处…...
visual studio 2017增加.cu文件
右击项目名称,选择生成依赖项>生成自定义把CUDA11.3target勾选上; 把带有cuda代码的.cpp文件和.cu文件右击属性>项类型>选择CUDA C/C 右击项目名称,C/C>命令行添加/D _CRT_SECURE_NO_WARNINGS; 选择CUDA C/C>命…...
linux 管道符 |
在Linux中,管道符(|)是一个非常重要的概念,它允许你将一个命令的输出作为另一个命令的输入。这种机制使得Linux命令可以非常灵活地进行组合,从而执行复杂的任务。 管道符的基本用法 假设你有两个命令:com…...
Android - SIP 协议
SIP 代表(会话发起协议)。 它是一种协议,可让应用程序轻松设置呼出和呼入语音呼叫,而无需直接管理会话、传输级通信或音频记录或回放。 SIP 应用程序 SIP 的一些常见应用是。 视频会议即时消息 开发要求 以下是开发 SIP 应用程序的要求 − Android 操作系…...

Python结合MobileNetV2:图像识别分类系统实战
一、目录 算法模型介绍模型使用训练模型评估项目扩展 二、算法模型介绍 图像识别是计算机视觉领域的重要研究方向,它在人脸识别、物体检测、图像分类等领域有着广泛的应用。随着移动设备的普及和计算资源的限制,设计高效的图像识别算法变得尤为重要。…...

【】AI八股-神经网络相关
Deep-Learning-Interview-Book/docs/深度学习.md at master amusi/Deep-Learning-Interview-Book GitHub 网上相关总结: 小菜鸡写一写基础深度学习的问题(复制大佬的,自己复习用) - 知乎 (zhihu.com) CV面试问题准备持续更新贴 …...
NodeJs的安装与环境变量配置
Node.js的环境变量配置主要涉及设置Node.js的安装路径、npm(Node Package Manager)的全局模块安装路径和缓存路径,以及可能需要的国内镜像源配置。以下是详细的配置步骤: 一、安装Node.js 下载Node.js安装包: 访问Nod…...
进程输入输出及终端属性学习
进程的标准输入输出 当主进程fork或exec子进程,文件描述符被继承,因此0,1,2句柄也被继承,从而使得telnet等服务,可以做到间接调用别的shell或程序。比如如果是远程登录使用的zsh,那么其会重定向到相应的pts $ ps|gre…...
关于redis集群和事务
最近为了核算项目的两个架构指标(可用性和伸缩性),需要对项目中使用的Redis数据库的集群部署进行一定程度的了解,当然顺便再学习一遍它的事务细节。 既然我在上面把Redis称之为数据库,那么在我们目前的项目里…...

ctfshow-web入门-文件包含(web88、web116、web117)
目录 1、web88 2、web116 3、web117 1、web88 没有过滤冒号 : ,可以使用 data 协议,但是过滤了括号和等号,因此需要编码绕过一下。 这里有点问题,我 (ls) 后加上分号发现不行,可能是编码结果有加号,题目…...

My sql 安装,环境搭建
以下以MySQL 8.0.36为例。 一、下载软件 1.下载地址官网:https://www.mysql.com 2. 打开官网,点击DOWNLOADS 然后,点击 MySQL Community(GPL) Downloads 3. 点击 MySQL Installer for Windows 4.点击Archives选择合适版本 5.选择后下载…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...