JUC 03
今天是2025/03/28 20:46 day 14
总路线请移步主页Java大纲相关文章
今天进行JUC 6,7,8 个模块的归纳
首先是JUC的相关内容概括的思维导图
由于内容比较多且重要,
个人还整理了一份详细JUC的思维导图,需要的请评论。是 xmind文件
6. 锁机制
深入解析 锁机制是JUC中处理线程同步的核心模块,其核心在于提供更精细的线程控制能力,同时兼顾性能优化。
核心组件扩展
-
ReentrantLock
-
公平锁 vs 非公平锁
-
公平锁:严格按照线程请求顺序分配锁(通过
new ReentrantLock(true)启用),但可能因频繁上下文切换降低吞吐量。 -
非公平锁:允许线程“插队”获取锁(默认模式),减少线程切换开销,但可能导致线程饥饿。
-
-
可重入性:同一线程可多次获取锁(锁计数器+1),必须等计数器归零后其他线程才能竞争。
-
锁中断:支持
lockInterruptibly(),允许线程在等待锁时响应中断。
-
-
ReentrantReadWriteLock
-
锁降级:写线程持有写锁时,可获取读锁后释放写锁,保证数据可见性。
-
锁升级限制:不允许读锁直接升级为写锁(可能导致死锁)。
-
-
StampedLock
-
乐观读:通过
tryOptimisticRead()获取“票据”(无锁),随后通过validate(stamp)验证数据是否被修改。 -
锁转换:支持将读锁转换为写锁(
tryConvertToWriteLock()),需处理可能的失败。 -
缺点:不支持可重入,且复杂的API容易引发错误。
-
-
Condition
-
精准唤醒:通过多个
Condition对象(如condition1、condition2)实现不同条件的等待与唤醒。 -
典型应用:生产者-消费者模型(不同条件队列管理生产者和消费者)。
-
底层原理
-
AQS(AbstractQueuedSynchronizer):锁机制的基石,通过CLH队列管理线程排队,利用
state变量表示锁状态。 -
CAS(Compare and Swap):通过原子操作(如
Unsafe类)实现锁状态的修改,避免传统互斥锁的性能问题。
使用场景与示例
-
高竞争写场景:使用
ReentrantLock的非公平模式提升吞吐量。 -
读多写少场景:优先选择
ReentrantReadWriteLock或StampedLock的乐观读。 -
复杂协作:使用
Condition实现线程间条件等待。
生产者-消费者示例
ReentrantLock lock = new ReentrantLock();
Condition notFull = lock.newCondition();
Condition notEmpty = lock.newCondition();
Queue<Integer> queue = new LinkedList<>();
int capacity = 10;
// 生产者
lock.lock();
try { while (queue.size() == capacity) { notFull.await(); // 等待队列不满 } queue.add(data); notEmpty.signal(); // 唤醒消费者
} finally { lock.unlock();
}
// 消费者
lock.lock();
try { while (queue.isEmpty()) { notEmpty.await(); // 等待队列不空 } data = queue.poll(); notFull.signal(); // 唤醒生产者
} finally { lock.unlock();
}
注意事项
-
死锁预防:避免嵌套锁请求,使用
tryLock()设置超时。 -
性能监控:通过JVM工具(如JConsole)监控锁竞争情况。
7. 工具类
深入解析 工具类通过封装复杂的线程协作逻辑,提供轻量级同步原语,适用于多种并发场景。
核心组件扩展
-
CountDownLatch
-
一次性屏障:计数器归零后无法重置,适合“主线程等待子线程初始化完成”的场景。
-
典型应用:微服务启动时等待所有依赖服务就绪。
-
-
CyclicBarrier
-
可重用性:通过
reset()重置计数器,适合分阶段任务(如多轮数据清洗)。 -
回调功能:构造时可传入
Runnable任务,所有线程到达屏障后触发。
-
-
Semaphore
-
公平性控制:构造函数支持公平模式(
new Semaphore(permits, true))。 -
动态调整许可:通过
release()和acquire()动态增减信号量。
-
-
Phaser
-
动态注册/注销:支持
register()和arriveAndDeregister()动态调整参与线程数。 -
分层阶段:支持多阶段任务(如
onAdvance()方法定义阶段结束条件)。
-
-
Exchanger
-
数据交换:两个线程通过
exchange()方法交换数据,适用于“流水线”处理模型。
-
底层原理
-
共享同步状态:多数工具类基于AQS实现(如
CountDownLatch使用AQS的共享模式)。 -
条件队列管理:如
CyclicBarrier通过ReentrantLock和Condition实现线程等待。
使用场景与示例
-
批量任务并行执行:
CyclicBarrier barrier = new CyclicBarrier(5, () -> System.out.println("All tasks ready!")); // 5个线程调用 barrier.await() -
限流保护:
Semaphore semaphore = new Semaphore(100); // 限制并发数为100 semaphore.acquire(); try { /* 访问资源 */ } finally { semaphore.release(); }
注意事项
-
避免线程泄漏:确保
CountDownLatch的计数器最终归零。 -
Phaser的灵活性:适合动态调整任务阶段的场景,但需谨慎处理阶段超时。
8. 高级主题
深入解析 高级主题聚焦于性能优化和复杂并发模型,需结合底层机制和实际场景综合运用。
核心内容扩展
-
原子类进阶
-
LongAdder:通过分段累加(Cell数组)减少CAS竞争,适用于高并发计数场景。
-
AtomicStampedReference:通过版本号解决ABA问题(如无锁栈的实现)。
-
-
并发集合优化
-
ConcurrentHashMap:
-
分段锁(Java 7):将数据分为16个Segment,降低锁粒度。
-
CAS + synchronized(Java 8+):对单个Node加锁,进一步提升并发度。
-
-
CopyOnWriteArrayList:每次写操作复制新数组,适合读多写极少场景(如监听器列表)。
-
-
Fork/Join框架
-
工作窃取算法:空闲线程从其他线程的任务队列尾部“窃取”任务,减少竞争。
-
递归任务拆分:通过
RecursiveTask或RecursiveAction实现分治逻辑。 -
示例(计算1~n的和):
class SumTask extends RecursiveTask<Long> { protected Long compute() { if (任务足够小) return 直接计算; else { SumTask left = new SumTask(...); SumTask right = new SumTask(...); left.fork(); return right.compute() + left.join(); } } }
-
-
CompletableFuture
-
链式调用:通过
thenApply(),thenCompose(),thenCombine()组合异步任务。 -
异常处理:通过
exceptionally()或handle()捕获异常。 -
超时控制:Java 9+支持
orTimeout()和completeOnTimeout()。
-
-
线程池调优
-
核心参数:
-
核心线程数:CPU密集型任务建议设置为CPU核数,IO密集型可适当增大。
-
队列选择:
SynchronousQueue(直接传递任务)、LinkedBlockingQueue(无界队列,可能OOM)。
-
-
监控指标:活跃线程数、队列堆积、任务拒绝次数(通过
ThreadPoolExecutor钩子方法)。
-
使用场景与示例
-
高并发计数器:
LongAdder adder = new LongAdder(); adder.increment(); // 线程安全
-
异步服务调用链:
CompletableFuture<User> future = CompletableFuture .supplyAsync(() -> getUserById(id), executor) .thenApplyAsync(user -> enrichUser(user), executor) .exceptionally(ex -> fallbackUser());
注意事项
-
无锁编程的陷阱:CAS可能导致“忙等待”,需结合退避策略(如指数退避)。
-
线程池资源隔离:不同业务使用独立线程池,避免相互影响。
总结 JUC的高级模块要求开发者深入理解底层机制(如AQS、CAS)并结合实际场景灵活选择工具。锁机制提供精细化控制,工具类简化线程协作,高级主题则通过原子类、Fork/Join等实现高效并发模型。在实际应用中,需结合性能监控工具(如Arthas、JProfiler)持续优化,平衡性能与复杂度。
相关文章:
JUC 03
今天是2025/03/28 20:46 day 14 总路线请移步主页Java大纲相关文章 今天进行JUC 6,7,8 个模块的归纳 首先是JUC的相关内容概括的思维导图 由于内容比较多且重要, 个人还整理了一份详细JUC的思维导图,需要的请评论。是 xmind文件 6. 锁机制 深入解析…...
CentOS 7 部署RuoYi 项目
换源 备份现有的 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 默认的 CentOS 官方镜像源替换为阿里云的镜像源,以提高下载速度和稳定性。 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.co…...
【JavaScript】八、对象
文章目录 1、对象的声明2、对象的使用3、对象中的方法4、遍历对象5、内置对象Math 1、对象的声明 一种数据类型,使用typeof查看类型,结果是object可以详细的描述描述某个事物 声明语法: // 多用花括号形式声明 // 比如声明一个person对象 …...
Processor System Reset IP 核 v5.0(vivado)
这个IP的作用,我的理解是,比普通按键复位更加高效灵活,可以配置多个复位输出,可以配置复位周期。 1、输入信号: 重要的信号有时钟clk信号,一般连接到系统时钟;输入复位信号,一般是外…...
linux0.11内核源码修仙传第十一章——硬盘初始化
🚀 前言 本文是初始化最后一部分了,对硬盘的初始化,对应于书中的第20回。希望各位给个三连,拜托啦,这对我真的很重要!!! 目录 🚀 前言🏆块设备管理dz…...
包络解调在故障诊断中的应用-广义检波解调案例
前言 前面我们曾介绍过广义检波解调的原理,那么今天就将学过的知识点真正用在故障诊断上,由于工厂数据集不能轻易获取,因此通过实验室仿真数据集来介绍整个诊断流程。 数据集 加拿大渥太华是故障诊断领域蛮出名的一个数据集,其…...
springboot 四层架构之间的关系整理笔记五
问题:service 和 多个serviceimpl 分层之间的逻辑关系? 好的!用班级活动的例子继续讲,假设班长(Service接口)要管理多种任务,而不同的班委(ServiceImpl实现类)负责不同场…...
喜报|迪捷软件入选工信部“2024年信息技术应用创新解决方案”
为进一步深化行业信息技术应用创新,健全信息技术应用创新产业生态,加快新技术新产品应用推广,强化应用牵引和需求导向,加强区域联动和资源整合,工业和信息化部网络安全产业发展中心(工业和信息化部信息中心…...
小林coding-12道Spring面试题
1.说一下你对 Spring 的理解?spring的核心思想说说你的理解? 2.Spring IoC和AOP 介绍一下?Spring的aop介绍一下?IOC和AOP是通过什么机制来实现的?怎么理解SpringIoc?依赖倒置,依赖注入,控制反转分别是什么?依赖注…...
2.Python 计算机二级题库:选择题答案解析
一 对 题目1 题目2 题目3 补充:在 Python 中,数字类型的复数类型是 complex。 题目4 题目5 题目6 题目7 题目8 题目9 题目10 题目11 题目12 题目13 题目14 题目15 题目16 题目17 题目18 题目19 题目20 题目21 题目22 题目23 题目24 题目25 题目26 题目27…...
使用Selenium和lxml库搜房网爬取某地区房屋信息(python、pycharm爬虫)
一、地址: url "https://zb.newhouse.fang.com/house/s/b91" # 第一页的 URL 但是这个爬虫我不知道为啥总是翻不了页数,请帮忙修改一下~ 二、用到的知识点以及代码详解: 这段代码是一个使用Selenium和lxml库实现的网页爬虫&a…...
大模型训练过程中KVCache与MLA
基础内容 在Transformer模型中,每个token有qkv三个属性,分别通过神经网络变换得到。1 根据Transformer中注意力公式,每个token的q需要和之前所有的k计算注意力,然后经过Softmax函数后乘以之前所有token的V,得到最终的…...
材质及制作笔记
基本流程: 建中模——zb雕刻高模——maya拓扑低模——拆uv——sp烘焙贴图——sp绘制材质——渲染 1 材质贴图: diffuse/albedo/basecolor:漫反射 reflection/specular:反射 metalness:金属度 glossiness…...
语音机器人与智能体结合
自从春节期间deepseek的发布,大家对语音机器人接入大模型格外的关注。最近又收到一个需求,是语音机器人与智能体的结合。 什么是智能体? 智能体(Agent)是指能够感知环境并采取行动以实现目标的实体。根据其复杂程度&am…...
使用git-lfs管理大文件
当我们使用git管理文件版本的时候,经常会有一些比较大的文件,比如一些模型文件,或者备份的文档资料等,这些文件属于如果太大,就会给git的管理带来困难。 所以,对于这种大文件,一般我们就会采用…...
vs2022+QT6.7.3打包程序流程
1、新建目录test 2、将项目配置为Release X64,生成XXX.exe 3、将XXX.exe放到test目录 4、管理员方式打开Qt 6.7.3 (MSVC 2022 64-bit),进入test目录,执行:windeployqt6.exe XXX.exe 5、管理员方式打开x64 Native Tools Command Pr…...
Axios企业级封装实战:从拦截器到安全策略!!!
🚀 Axios企业级封装实战:从拦截器到安全策略 🔧 核心代码解析 // 创建Axios实例 const service axios.create({baseURL: api, // 🌐 全局API前缀timeout: 0, // ⏳ 永不超时(慎用!)withCrede…...
关于计算机视觉中的插值小记
计算机视觉中的插值(Interpolation)讲解 插值(Interpolation)在计算机视觉中是一项基础操作,常用于图像缩放、旋转、去噪、图像重建等任务。其核心思想是在已知数据点之间进行推测,估计未知的像素值或特征…...
img 的 onerror属性
名词解释: img 标签的 onerror 属性是一个事件处理属性,当图片因 src 地址无效、网络问题或其他加载错误导致加载失败时,会触发该属性内的代码。 1. <img> 标签的 src 属性 src(source 的缩写)属性是 <img…...
Zerotier虚拟局域网在树莓派的应用和Syncthing配合Zerotier实现端到端文件同步
一、Zerotier的部署 1、官网注册账号 https://my.zerotier.com/i 2、选择linux系统,执行安装Zerotier curl -s https://install.zerotier.com | sudo bash3、将树莓派网络加入Zerotier zerotier-cli join DB62228FEDF6CE55DB62228FEDF6CE55 为你的Zerotier IP 需…...
51c嵌入式~三极管~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12208603 一、PNP与NPN两种三极管使用方法 分享这篇文章总结下关于NPN和PNP两种型号三极管的使用和连接方法。 在单片机应用电路中三极管主要的作用就是开关作用。 PNP与NPN两种三极管使用方法 上图中,横向左…...
Logback使用和常用配置
Logback 是 Spring Boot 默认集成的日志框架,相比 Log4j,它性能更高、配置更灵活,并且天然支持 Spring Profile 多环境配置。以下是详细配置步骤及常用配置示例。 一、添加依赖(非 Spring Boot 项目) 若项目未使用 Sp…...
SQL中累计求和与滑动求和函数sum() over()的用法
[TOC](SQL中累计求和与滑动求和函数sum() over()的用法) 一、窗口函数功能简介 sum(c) over(partition by a order by b) 按照一定规则汇总c的值,具体规则为以a分组,每组内按照b进行排序,汇总第一行至当前行的c的加和值。 sum():…...
【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)
大家好,我是全栈小5,欢迎来到《小5讲堂》。 这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言认识雪花ID…...
FPGA——分秒计数器设计(DE2-115开发板)
一、项目创建 1.创建工程 点击File->New Project Wizard...或者直接在页面处点击 在第一行选择文件存放地点,第二行为项目名称,第三行为顶级设计实体名称 (下面的步骤可以暂时不做直接点Finish,因为是先写代码先把它跑出来暂…...
雅思练习总结(九)
雅思练习总结(九) 本文章是雅思练习总结(九),总结了文章《BAKELITE》,内容包括原文精翻,文章脉络总结,单词扩展学习3个部分 1 文章原文及翻译 BAKELITE 翻译:贝克莱特…...
windows USB 了解
GUID GUID 是一个 128 位的数字,在全球范围内是独一无二的,常被用于标识软件组件、设备接口等,以保证在不同系统和环境中能唯一识别特定对象。 DEFINE_GUID(GUID_DEVINTERFACE_USCUSTOMKEYS, 0x12345678, 0x1234, 0x5678, 0x12, 0x12, 0x23…...
光谱相机的光谱信息获取
光谱信息的获取方式主要依赖于不同分光技术和成像方法,将入射光分解为不同波长并记录其强度。以下是常见的光谱信息获取技术分类及原理: 1. 分光技术(物理分解波长) (1) 滤光片法 原理:使用固定或可调滤…...
免去繁琐的手动埋点,Gin 框架可观测性最佳实践
作者:牧思 背景 在云原生时代的今天,Golang 编程语言越来越成为开发者们的首选,而对于 Golang 开发者来说,最著名的 Golang Web 框架莫过于 Gin [ 1] 框架了,Gin 框架作为 Golang 编程语言官方的推荐框架 [ 2] &…...
构建大语言模型应用:简介(第一部分)
本专栏聚焦大语言模型(LLM)相关内容的解析,通过检索增强生成(RAG)应用的视角来进行。 本系列文章 简介(本文)数据准备句子转换器向量数据库搜索与检索大语言模型开源检索增强生成评估大语言模…...
