当前位置: 首页 > article >正文

深入Java多线程进阶:从锁策略到并发工具全解析

带你深入了解更高级的多线程知识包括各种锁策略、CAS机制、synchronized原理、JUC工具类等核心内容。这些知识是成为Java高级开发者的必经之路也是面试中经常考察的重点。1. 常见的锁策略乐观锁 vs 悲观锁这是两种截然不同的并发控制思路悲观锁总是假设最坏情况每次访问共享资源前都会加锁。比喻是同学A认为老师很忙会先发消息确认老师是否有空加锁操作得到肯定答复后才去问问题。典型的实现是synchronized和ReentrantLock。乐观锁假设冲突不常发生访问数据时不加锁只在更新时检查是否有冲突。比喻是同学B认为老师很闲直接去找老师问问题。如果老师确实忙就下次再来。典型实现是CAS机制。适用场景锁竞争激烈时悲观锁更合适锁竞争不激烈时乐观锁效率更高重量级锁 vs 轻量级锁重量级锁依赖操作系统提供的mutex互斥锁实现涉及大量内核态/用户态切换容易引发线程调度成本较高。轻量级锁尽量在用户态完成加锁操作减少系统调用开销。synchronized开始是轻量级锁冲突严重时升级为重量级锁。内核态 vs 用户态的比喻在银行窗口外自己办理业务是用户态效率可控在窗口内由工作人员办理是内核态效率不可控。自旋锁传统锁在获取失败时线程会进入阻塞状态放弃CPU。自旋锁采用不同策略// 自旋锁伪代码 while(抢锁(lock) 失败) {}特点优点不放弃CPU一旦锁释放能立即获取缺点如果锁持有时间长会持续消耗CPU资源比喻追求女神时死皮赖脸每天问候自旋锁 vs 陷入沉沦很久后再尝试挂起等待锁。公平锁 vs 非公平锁公平锁遵守先来后到按请求顺序分配锁非公平锁不按顺序允许插队synchronized是非公平锁。公平锁需要额外数据结构记录线程顺序可能降低吞吐量。可重入锁 vs 不可重入锁可重入锁允许同一线程多次获取同一把锁不可重入锁不允许会导致死锁把自己锁死的场景线程持有锁后再次尝试获取同一把锁如果是不可重入锁就会死锁。Java中的synchronized和ReentrantLock都是可重入锁。读写锁针对读多写少场景的优化锁读锁与读锁不互斥写锁与写锁互斥读锁与写锁互斥Java的ReentrantReadWriteLock实现了读写锁。举例教务系统中查看同学列表读操作频繁修改同学列表写操作不频繁。2. CASCompare and Swap什么是CASCAS是一种无锁编程技术包含三个操作比较内存值V与预期值A如果相等将新值B写入V返回操作是否成功// CAS伪代码 boolean CAS(address, expectValue, swapValue) { if (address expectedValue) { address swapValue; return true; } return false; }CAS是原子的硬件指令可视为乐观锁的一种实现。CAS的应用1. 实现原子类AtomicInteger atomicInteger new AtomicInteger(0); atomicInteger.getAndIncrement(); // 线程安全的i2. 实现自旋锁基于CAS可以实现更灵活的自旋锁。ABA问题问题描述线程t1读取值A准备改为Z。在此期间t2将值从A改为B又改回A。t1的CAS操作会成功但无法感知中间的变化。解决方案引入版本号每次修改版本号1CAS比较值和版本号Java提供AtomicStampedReference解决此问题翻新手机的比喻无法区分是全新手机还是翻新后又恢复原样的手机。3. synchronized原理synchronized的特性JDK 1.8开始是乐观锁冲突频繁时转为悲观锁开始是轻量级锁持有时间长时转为重量级锁轻量级锁实现用自旋锁策略非公平锁可重入锁不是读写锁加锁工作过程JVM将锁状态分为四级逐步升级1. 偏向锁第一个加锁线程进入偏向状态只是做标记不真正加锁后续无竞争则避免加锁开销有竞争时取消偏向进入轻量级锁2. 轻量级锁通过CAS实现竞争不激烈时使用自适应自旋根据情况调整自旋次数3. 重量级锁竞争激烈时使用依赖操作系统mutex涉及内核态切换成本高其他优化锁消除JVM检测到不可能存在共享数据竞争时消除不必要的锁。锁粗化将多次连续的加锁解锁合并为一次减少开销。4. JUCjava.util.concurrent常见类Callable接口与Runnable相比Callable可以有返回值和抛出异常。CallableInteger callable new CallableInteger() { Override public Integer call() throws Exception { int sum 0; for (int i 1; i 1000; i) { sum i; } return sum; } }; FutureTaskInteger futureTask new FutureTask(callable); Thread t new Thread(futureTask); t.start(); int result futureTask.get(); // 阻塞等待结果ReentrantLock可重入互斥锁比synchronized更灵活ReentrantLock lock new ReentrantLock(); lock.lock(); try { // working } finally { lock.unlock(); // 必须手动释放 }与synchronized的区别手动释放锁可尝试获取锁tryLock可配置公平锁更精确的等待-唤醒机制原子类基于CAS实现的高性能原子操作类AtomicInteger、AtomicLong、AtomicBoolean等性能远高于加锁实现线程池核心参数理解文档用开公司比喻corePoolSize正式员工数永不辞退maximumPoolSize正式员工临时工数keepAliveTime临时工空闲时间workQueue任务队列RejectedExecutionHandler拒绝策略四种拒绝策略AbortPolicy抛出异常CallerRunsPolicy调用者执行DiscardOldestPolicy丢弃最老任务DiscardPolicy丢弃新任务信号量Semaphore控制同时访问特定资源的线程数量Semaphore semaphore new Semaphore(4); // 4个可用资源 semaphore.acquire(); // 申请资源(P操作) // 访问资源 semaphore.release(); // 释放资源(V操作)比喻停车场车位展示牌。CountDownLatch等待多个任务完成CountDownLatch latch new CountDownLatch(10); // 每个任务完成后调用 latch.countDown(); // 主线程等待 latch.await();比喻跑步比赛所有选手到达终点才公布成绩。5. 线程安全的集合类CopyOnWriteArrayList写时复制的线程安全List写操作复制新数组不影响读操作读多写少时性能高读操作不需要加锁ConcurrentHashMap线程安全的HashMap相比Hashtable的优化锁粒度更细锁每个桶链表头节点而非整个表CAS优化size等属性用CAS更新扩容优化化整为零多线程协助扩容结构优化链表过长转红黑树Java 86. 死锁死锁产生的四个必要条件互斥使用资源不能共享不可抢占不能强制夺取资源请求和保持持有资源同时请求新资源循环等待形成等待环路如何避免死锁最实用的是破坏循环等待按固定顺序获取锁。// 错误可能死锁 线程1lock1 - lock2 线程2lock2 - lock1 // 正确按固定顺序 线程1lock1 - lock2 线程2lock1 - lock2吃饺子需要酱油和醋的生动比喻说明了死锁场景。7. 常见面试题解析最后列出了多个高频面试题volatile关键字的用法保证内存可见性不保证原子性Java多线程数据共享通过堆内存共享数据线程状态转换NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATEDConcurrentHashMap的优化锁分段-锁桶、链表转红黑树、协助扩容进程和线程的区别资源分配 vs 调度单位、内存空间是否共享总结Java多线程进阶涉及的知识点既深且广。从基础的锁策略到CAS机制从synchronized的内部原理到JUC工具类的使用每一部分都需要深入理解。关键要点理解不同锁策略的适用场景没有绝对的优劣掌握CAS的原理和局限性特别是ABA问题了解synchronized的优化过程从偏向锁到重量级锁熟练使用JUC工具类根据场景选择合适工具重视线程安全问题使用线程安全集合或手动同步避免死锁按顺序获取锁多线程编程如同走钢丝需要在性能和正确性之间找到平衡。希望这篇博客能帮助你在多线程的道路上走得更稳更远。在实践中不断尝试和思考你会逐渐掌握这门艺术。

相关文章:

深入Java多线程进阶:从锁策略到并发工具全解析

带你深入了解更高级的多线程知识,包括各种锁策略、CAS机制、synchronized原理、JUC工具类等核心内容。这些知识是成为Java高级开发者的必经之路,也是面试中经常考察的重点。1. 常见的锁策略乐观锁 vs 悲观锁这是两种截然不同的并发控制思路:悲…...

从NumPy ndarray到Mojo Tensor:零拷贝内存共享的3层协议解析(Intel XPU/Ampere GPU双平台实测延迟<87ns)

第一章&#xff1a;从NumPy ndarray到Mojo Tensor&#xff1a;零拷贝内存共享的3层协议解析&#xff08;Intel XPU/Ampere GPU双平台实测延迟<87ns&#xff09;零拷贝内存共享并非简单指针传递&#xff0c;而是由硬件抽象层、内存描述符协商层与运行时绑定层共同构成的三重协…...

2026-04-07 GitHub 热点项目精选

/* 全局样式 */* { margin: 0; padding: 0; box-sizing: border-box; }body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;max-width: 900px; margin: 0 auto; padding: 30px 20px; line-height: 1.7; color: #2d3748;backgro…...

GaussDB /openGauss 与 MySQL、Oracle、PostgreSQL 核心对比表

GaussDB /openGauss 与 MySQL、Oracle、PostgreSQL 核心对比表&#xff08;偏选型实用版&#xff0c;重点看业务适配、迁移成本、国产化、性能&#xff09;一、整体定位对比表格数据库定位适用场景国产化属性GaussDB企业级分布式关系库&#xff0c;软硬协同金融核心、政务、高并…...

Python AOT编译不再依赖LLVM:2026插件如何实现纯Python源码→本地机器码直编?下载链接+SHA3-512校验值全公开

第一章&#xff1a;Python 原生 AOT 编译方案 2026 插件下载与安装Python 原生 AOT&#xff08;Ahead-of-Time&#xff09;编译方案 2026 是 CPython 官方实验性扩展项目&#xff0c;旨在为 Python 提供无需运行时解释器即可生成独立可执行文件的能力。该方案基于 PEP 712 和 L…...

FastAPI 2.0流式响应必须立即升级的4项配置——PyPI最新2.0.10已强制校验,旧版部署将在Q3自动降级为同步模式

第一章&#xff1a;FastAPI 2.0流式响应架构演进与强制校验机制解析FastAPI 2.0 对流式响应&#xff08;StreamingResponse&#xff09;进行了底层重构&#xff0c;将 ASGI 生命周期与 Pydantic v2 的严格校验深度耦合&#xff0c;彻底分离了响应生成与序列化阶段。这一演进使开…...

3分钟打造专业数据大屏:DataRoom开源可视化设计器终极指南

3分钟打造专业数据大屏&#xff1a;DataRoom开源可视化设计器终极指南 【免费下载链接】DataRoom &#x1f525;基于SpringBoot、MyBatisPlus、ElementUI、G2Plot、Echarts等技术栈的大屏设计器&#xff0c;具备目录管理、DashBoard设计、预览能力&#xff0c;支持MySQL、Oracl…...

Zotero PDF Translate:让学术研究跨越语言边界的智能翻译解决方案

Zotero PDF Translate&#xff1a;让学术研究跨越语言边界的智能翻译解决方案 【免费下载链接】zotero-pdf-translate Translate PDF, EPub, webpage, metadata, annotations, notes to the target language. Support 20 translate services. 项目地址: https://gitcode.com/…...

自动驾驶仿真新手必看:OpenSCENARIO 1.0标准场景搭建实战(附51Sim-One配置指南)

自动驾驶仿真实战&#xff1a;从零搭建OpenSCENARIO 1.0标准场景 当一辆自动驾驶汽车在虚拟世界中完成百万公里测试时&#xff0c;背后是无数标准化场景的精确还原。OpenSCENARIO作为自动驾驶仿真领域的"通用语言"&#xff0c;正在改变行业各自为战的局面。本文将带…...

ES6——数组的扩展详解

数组的扩展详解1、Array.from()2、Array.of()3、数组实例的copyWithin()4、数组实例的find()和findIndex()5、数组实例的fill()6、数组实例的entries()、keys()和values()8、数组的空位9、数组推导1、Array.from() Array.from方法用于将两类对象转为真正的数组&#xff1a;类似…...

拉普拉斯变换:从傅里叶到复频域的系统分析利器

1. 从傅里叶到拉普拉斯&#xff1a;为什么我们需要复频域&#xff1f; 第一次接触傅里叶变换时&#xff0c;你可能被它"时域转频域"的魔法惊艳到了——直到遇到一个尴尬问题&#xff1a;当信号不满足绝对可积条件时&#xff08;比如指数增长的信号e^t&#xff09;&am…...

PHP如何利用Redis缓存提升性能?Redis缓存机制在PHP中的实现与优化

将PHP应用中频繁查询的数据库结果、动态内容或资源存储在Redis中&#xff0c;通过直接访问内存而非数据库来显著减少页面加载时间&#xff0c;例如使用phpredis扩展连接Redis并设置缓存键值来优化。例如&#xff0c;代码示例&#xff1a;if ($cachedData $redis->get(user_…...

RePKG技术指南:Wallpaper Engine资源文件解析与转换工具深度解析

RePKG技术指南&#xff1a;Wallpaper Engine资源文件解析与转换工具深度解析 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专门为Wallpaper Engine设计的C#开源工具&a…...

多租户下的系统业务开发过程探讨痛

一、背景与问题缘起 MySQL 5.6.51 版本下 2000 万行核心业务表开展新增字段操作&#xff0c;需求为新增BIGINT(19) NOT NULL DEFAULT 0 COMMENT 注释&#xff08;因业务实际需要存储大数值关联字段&#xff09;。 表的核心特性为Java 多线程密集读写&#xff0c;业务请求持续高…...

技术判断力之AI三问涌

认识Pass层级结构 Pass范围从上到下一共分为5个层级&#xff1a; 模块层级&#xff1a;单个.ll或.bc文件 调用图层级&#xff1a;函数调用的关系。 函数层级&#xff1a;单个函数。 基本块层级&#xff1a;单个代码块。例如C语言中{}括起来的最小代码。 指令层级&#xff1a;单…...

文件(内部/外部)存储

Android 文件存储主要分为**内部存储**、**外部存储**(现在叫分区存储)和**其他介质**(如 SD 卡、USB)。理解它们的区别对开发很重要,特别是 Android 10+ 引入的**分区存储**机制。 1. 内部存储 (Internal Storage) 特点:私有、安全、随应用卸载而删除。其他应用和用户…...

从安防到自动驾驶:红外-可见光融合技术落地避坑指南

从安防到自动驾驶&#xff1a;红外-可见光融合技术落地避坑指南 在智能安防和自动驾驶领域&#xff0c;夜间或恶劣天气条件下的视觉感知一直是技术难点。红外与可见光图像融合&#xff08;IVIF&#xff09;技术通过结合两种模态的优势——可见光的高分辨率纹理和红外成像的环境…...

比迪丽LoRA部署教程:WSL2+Windows本地GPU环境全适配方案

比迪丽LoRA部署教程&#xff1a;WSL2Windows本地GPU环境全适配方案 你是不是也想在本地电脑上运行AI绘画&#xff0c;生成自己喜欢的动漫角色&#xff1f;特别是像《龙珠》里的比迪丽这样的经典角色&#xff0c;如果能用自己的电脑随时生成&#xff0c;那该多方便。 今天我就…...

MATLAB伯德图进阶:精准标注谐振点与-3dB带宽的实现方法

1. 伯德图基础与谐振点概念解析 伯德图是控制系统工程师最常用的频率特性分析工具之一&#xff0c;它由幅频特性和相频特性两条曲线组成。我第一次接触伯德图是在研究生阶段的自动控制原理课上&#xff0c;当时教授在黑板上画出的那条神奇的曲线&#xff0c;让我对频率响应分析…...

如何用Python+Neo4j构建医疗知识图谱?从数据清洗到因果推断实战

医疗知识图谱实战&#xff1a;用PythonNeo4j实现药品副作用因果推断 在医疗AI领域&#xff0c;知识图谱正成为连接海量医学数据与临床决策的桥梁。当一位患者同时服用多种药物时&#xff0c;如何准确预测潜在的药物相互作用&#xff1f;当流行病学研究发现某种症状与基因突变相…...

忍者像素绘卷企业应用:游戏公司快速产出像素风角色立绘的落地实践

忍者像素绘卷企业应用&#xff1a;游戏公司快速产出像素风角色立绘的落地实践 1. 像素艺术在游戏行业的价值与挑战 像素艺术作为一种独特的视觉风格&#xff0c;近年来在游戏行业迎来了复兴。从独立游戏到3A大作&#xff0c;越来越多的开发者选择用像素风格唤起玩家的怀旧情感…...

Python数据库编程全面指南:从SQL到NoSQL

Python数据库编程全面指南&#xff1a;从SQL到NoSQL 1. 背景介绍 数据库是现代应用程序的核心组件之一&#xff0c;用于存储和管理数据。Python作为一种广泛使用的编程语言&#xff0c;提供了丰富的库和工具来与各种数据库进行交互。本文将全面介绍Python数据库编程&#xff0c…...

从零搭建Chiplet系统?保姆级梳理UCIe实战中的那些“坑”:Sideband流控、时钟门控与多模块链路

从零搭建Chiplet系统&#xff1a;UCIe实战中的关键挑战与解决方案 在半导体行业追求更高性能、更低功耗的今天&#xff0c;Chiplet技术已成为突破传统单芯片设计瓶颈的重要路径。作为连接不同Chiplet的"桥梁"&#xff0c;UCIe(Universal Chiplet Interconnect Expres…...

Qt窗口管理:深入解析close与hide函数的应用场景与性能影响

1. Qt窗口管理基础&#xff1a;理解close与hide的核心差异 刚开始接触Qt开发时&#xff0c;我也曾被close()和hide()这两个看似相似的函数搞糊涂过。直到有次在项目中错误使用了close()导致整个界面崩溃&#xff0c;才真正意识到它们的本质区别。简单来说&#xff0c;hide()就像…...

如何用交换机命令行创建 VLAN(轻松秒懂)

第一步&#xff1a;进入配置模式刚连上交换机时&#xff0c;你只能看状态、不能改配置&#xff0c;就像只能看电视不能换台一样。只有输入这条命令&#xff0c;才能进入设置模式&#xff0c;获得修改配置的权限&#xff1a;system-view第二步&#xff1a;创建 VLAN我们以最常见…...

三步解锁Cursor Pro功能:免费体验AI编程助手完整能力

三步解锁Cursor Pro功能&#xff1a;免费体验AI编程助手完整能力 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tria…...

SEO检测工具有哪些_使用SEO检测工具需要注意哪些事项

SEO检测工具有哪些 在当前的互联网市场中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;是提高网站流量和品牌知名度的关键手段之一。为了帮助网站达到最佳的SEO效果&#xff0c;SEO检测工具应运而生。市场上有哪些可靠的SEO检测工具呢&#xff1f;常见的有Ahrefs、SEM…...

智能提取码工具:重新定义百度网盘资源获取效率

智能提取码工具&#xff1a;重新定义百度网盘资源获取效率 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 在数字化时代&#xff0c;百度网盘已成为重要的资源分享平台&#xff0c;但提取码验证常常成为资源获取的瓶颈。智能提…...

别再乱用ref和reactive了!Vue3响应式API实战避坑指南(附代码对比)

Vue3响应式API深度解析&#xff1a;从原理到实战的避坑指南 在Vue3的日常开发中&#xff0c;ref和reactive这两个响应式API的使用频率极高&#xff0c;但许多开发者在使用过程中常常陷入各种"陷阱"。本文将深入剖析它们的底层机制&#xff0c;并通过实际案例展示如何…...

AI Agent Harness Engineering 在电商场景中的购物助手实践

AI Agent Harness Engineering 全链路实战:从0到1打造懂你的「超级电商购物助手」 1. 标题 (Title) 以下是针对本次主题的5个核心标题,覆盖了新手入门友好、技术深度拆解、业务价值落地三个不同的传播切入点: 新手入门:AI Agent Harness Engineering 全链路实战——从0到1…...