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

美团java后端面试-乐观锁vs悲观锁

前言在多线程编程和高并发系统设计中数据一致性是悬在开发者头顶的达摩克利斯之剑。当多个用户或线程同时尝试修改同一份数据时如何避免数据错乱就成了必须解决的问题。锁机制应运而生而乐观锁与悲观锁则是并发控制领域两种最基础、最典型的策略。它们不仅代表了不同的技术实现更蕴含着两种截然不同的设计哲学。本文将深入探讨两者的核心思想、实现原理、优缺点及适用场景。一、核心思想两种世界观的对立悲观锁的名字已经揭示了它的世界观悲观、谨慎、防御。它基于一种最坏的假设——认为多个线程同时修改共享数据的概率很高冲突是常态而非例外。因此在操作任何共享资源之前悲观锁都会先进行加锁操作确保只有获得锁的线程可以访问数据其他线程必须排队等待。这种机制本质上是将并发操作强行转为串行操作以绝对的顺序性来换取数据的绝对安全。在悲观锁看来与其冒着数据出错的风险并行不如稳妥地一个个来。与悲观锁的保守不同乐观锁则秉持一种乐观、进取的态度。它假设多线程同时修改同一数据的概率很低冲突只是小概率事件。因此它并不提前加锁而是鼓励线程直接操作数据。只有当线程准备提交修改的那一刻它才会去检查数据是否被他人动过。如果检测到冲突乐观锁不会去阻塞或等待而是让操作失败并回滚通常由业务层决定是否重试。这种机制类似于git的版本管理大家各自在本地分支工作只有在push时才发现冲突需要先pull解决冲突再push。对比维度 悲观锁 乐观锁核心假设 冲突必然发生安全第一 冲突概率较低效率优先加锁时机 读取数据前 更新数据时检测冲突并发策略 阻塞等待串行执行 无阻塞但需重试机制典型代表 数据库行锁、synchronized 版本号机制、CAS算法二、实现机制与代码逻辑悲观锁的实现悲观锁通常依赖于底层系统或数据库提供的原生锁机制。数据库层面的悲观锁在关系型数据库中最常见的实现是SELECT … FOR UPDATE。在一个事务中执行此语句后数据库会对查询结果集的行加锁。其他事务如果试图更新这些行或者执行另一个SELECT … FOR UPDATE都会被阻塞直到原事务提交或回滚。例如在电商系统中扣减库存时通常会先开启事务然后通过FOR UPDATE锁住库存记录读取当前库存计算新库存执行UPDATE最后提交事务。这一过程虽然保证了数据准确但在高并发下会导致大量线程排队吞吐量下降。编程语言层面的悲观锁在Java中synchronized关键字和ReentrantLock类都是悲观锁的实现。它们确保在同一个时刻只有一个线程能执行被保护的代码块。当一个线程进入同步块其他试图进入的线程会被挂起进入阻塞状态直到锁被释放。乐观锁的实现乐观锁通常由应用程序自身实现无需数据库内置的排他锁。版本号机制这是最经典的方式。在数据表中增加一个整数类型的version字段。读取数据时将version一起读出。执行更新操作时SQL语句如下sqlUPDATE table_nameSET value ‘新值’, version version 1WHERE id 某值 AND version 旧版本号;程序通过检查Affected rows来判断是否更新成功。如果返回0说明在此期间version已被其他线程修改操作失败。业务层需要捕获这个失败并决定是重试整个操作还是放弃。这种方式适用于读多写少的场景如文章阅读量的更新。时间戳机制与版本号类似使用时间戳字段来判断数据的新旧。更新时要求当前时间戳必须等于读取时的时间戳。但由于时间戳在极短时间内可能重复或产生误差其可靠性不如版本号。CAS算法在无锁编程领域Compare-And-Swap是一种硬件级别的乐观锁实现。它是一个原子指令包含三个操作数内存地址V、旧的预期值A和新值B。只有当V的值等于A时处理器才会将其更新为B。Java的java.util.concurrent.atomic包下的原子类如AtomicInteger正是基于CAS实现的。CAS避免了用户态锁的上下文切换开销但在高并发下可能会导致ABA问题即值从A变成B又变回ACAS误认为未改变通常需要通过版本号如AtomicStampedReference来解决。三、深度剖析优缺点与适用场景选择乐观锁还是悲观锁是一场关于一致性、并发性、复杂度和业务场景的综合博弈。悲观锁的优劣与场景优点强一致性通过严格的锁机制保证了数据在任何时刻的准确性避免了脏读、不可重复读和幻读。使用简单对开发者来说逻辑直观易懂。在冲突严重的场景下避免了复杂的重试逻辑。缺点性能开销大锁的获取和释放、线程的挂起和唤醒都是昂贵的操作涉及内核态与用户态的切换。死锁风险如果加锁顺序不当容易造成死锁需要开发者谨慎设计。降低并发度阻塞机制严重限制了系统的吞吐量。适用场景写多读少、冲突严重的场景。例如金融系统中的账户扣款、秒杀活动中的库存扣减、机票预订系统的座位锁定。这些场景数据敏感度高冲突概率大宁愿牺牲一点并发也要保证数据绝对正确。乐观锁的优劣与场景优点高并发性能无需等待和阻塞大大提高了系统的吞吐量特别适合读操作远多于写操作的场景。无死锁问题因为没有持有锁自然避免了死锁的发生。轻量级CAS操作直接在硬件层面完成开销远小于线程挂起。缺点ABA问题如前所述CAS可能无法感知中间的变化过程。高竞争下性能下降如果冲突频繁大量的操作会失败并不断重试反而会浪费CPU资源导致性能不如悲观锁。一致性较弱只能保证最终一致性在事务隔离级别上不如悲观锁严格。适用场景读多写少、冲突概率低的场景。例如博客文章阅读量统计、社交媒体的点赞功能、配置文件更新、用户资料浏览。在这些场景中大家同时修改同一条数据的概率很低使用乐观锁能最大化利用系统资源。四、总结与选型建议悲观锁与乐观锁并非水火不容而是相辅相成的并发控制手段。它们分别代表了“预防”与“容忍”两种系统设计哲学。在实际的架构设计中理智的做法往往是混合使用。例如在一个电商系统中对于秒杀的核心库存由于冲突率极高可以使用数据库的行锁悲观锁或分布式锁来严防死守确保不超卖。对于生成订单后的商品销量更新可以采用乐观锁版本号进行异步更新允许偶尔的重试提升用户体验。对于用户购物车中商品信息的冗余更新可以使用CAS操作保证原子性。理解这两种锁的本质有助于开发者在面对复杂的业务场景时跳出技术的表象从并发控制的底层哲学出发做出最适合当前业务约束的技术决策。

相关文章:

美团java后端面试-乐观锁vs悲观锁

前言 在多线程编程和高并发系统设计中,数据一致性是悬在开发者头顶的达摩克利斯之剑。当多个用户或线程同时尝试修改同一份数据时,如何避免数据错乱,就成了必须解决的问题。锁机制应运而生,而乐观锁与悲观锁则是并发控制领域两种最…...

PP-DocLayoutV3作品展示:学术海报中图注/标题/方法/结果区块自动划分

PP-DocLayoutV3作品展示:学术海报中图注/标题/方法/结果区块自动划分 1. 引言:当AI学会“阅读”学术海报 想象一下这个场景:你是一位科研人员,正在准备一场重要的学术会议。手头有几十篇相关领域的论文海报需要快速阅读、整理和…...

Qwen3-0.6B-FP8惊艳表现:在‘写一段鲁迅风格评论AI伦理’任务中获人工评分4.8/5

Qwen3-0.6B-FP8惊艳表现:在‘写一段鲁迅风格评论AI伦理’任务中获人工评分4.8/5 最近,一个只有6亿参数的小模型Qwen3-0.6B-FP8,在一项特殊的文本生成任务中,获得了接近满分的评价。这项任务要求模型模仿鲁迅先生的文风&#xff0…...

春联生成模型-中文-base效果展示:同一关键词不同temperature生成对比

春联生成模型-中文-base效果展示:同一关键词不同temperature生成对比 1. 模型效果展示概览 春联生成模型-中文-base是达摩院AliceMind团队基于基础生成大模型开发的特色应用。这个模型有一个很实用的功能:只需要输入两个字的祝福词,就能自动…...

all-MiniLM-L6-v2多场景落地:智能办公助手语义理解、会议纪要关键句提取、邮件分类

all-MiniLM-L6-v2多场景落地:智能办公助手语义理解、会议纪要关键句提取、邮件分类 你是不是也经常被这些办公琐事搞得头大?每天要处理上百封邮件,分不清哪些是重要通知,哪些是垃圾广告;开完会面对几小时的录音和混乱…...

DeepSeek-OCR部署避坑指南:首次加载权重慢、显存不足报错解决方案

DeepSeek-OCR部署避坑指南:首次加载权重慢、显存不足报错解决方案 1. 为什么你刚点启动就卡住?——直面两大高频痛点 刚把 DeepSeek-OCR-2 下载好,兴冲冲运行 python app.py,结果终端停在 Loading model... 十几分钟不动&#x…...

自然语言处理(词向量转化)PCA降维

一、自然语言处理NLP,自然语言处理,和机器学习一样是人工智能的一个领域,如果说机器学习是让机器像人一样会发现规律,那自然语言处理中的词向量转化就是把语言(中文,英文等语言)转化为向量&…...

AIGlasses_for_navigation实用效果:分割结果导出为JSON坐标供下游TTS播报

AIGlasses_for_navigation实用效果:分割结果导出为JSON坐标供下游TTS播报 1. 项目介绍与核心价值 AIGlasses_for_navigation是一个基于YOLO分割模型的智能视觉导航系统,专门为视障人士设计。这个系统能够实时检测和分割道路上的关键导航元素&#xff0…...

多维复高斯分布PDF表达式、协方差矩阵意义探究

背景学习《空间信息论》时,对于高斯白噪情况下,雷达接收信号在已知距离和散射特性条件下,似然概率往往取决于噪声的PDF,即时间采样点为N的接收信号符合N维复高斯分布。欲推导的表达式,首先要使用N维复高斯分布的PDF表达…...

DeOldify图像风格参考学习:输入参考图指导整体色调倾向

DeOldify图像风格参考学习:输入参考图指导整体色调倾向 1. 项目简介 这是一个基于DeOldify深度学习模型的黑白图像上色服务,可以将黑白照片自动转换为彩色照片。与传统的自动上色不同,本服务支持通过参考图像来指导整体色调倾向&#xff0c…...

nomic-embed-text-v2-moe效果展示:俄语法律条文嵌入在MIRACL测试集上的SOTA表现

nomic-embed-text-v2-moe效果展示:俄语法律条文嵌入在MIRACL测试集上的SOTA表现 1. 模型核心能力概览 nomic-embed-text-v2-moe是一款专为多语言文本检索设计的嵌入模型,在俄语法律条文等专业领域表现出色。这个模型最大的特点是采用了混合专家&#x…...

FLUX.1-dev-fp8-dit文生图效果展示:低提示词依赖下SDXL风格稳定输出能力实测

FLUX.1-dev-fp8-dit文生图效果展示:低提示词依赖下SDXL风格稳定输出能力实测 一句话看懂本文价值:FLUX.1-dev-fp8-dit模型在简单提示词下,就能生成风格稳定、质量惊艳的图片,大幅降低了AI绘画的使用门槛。 1. 开篇:为什…...

Phi-3-mini-128k-instruct部署教程:支持OpenAI兼容API,无缝接入现有工具链

Phi-3-mini-128k-instruct部署教程:支持OpenAI兼容API,无缝接入现有工具链 1. 模型简介 Phi-3-Mini-128K-Instruct是一个38亿参数的轻量级开放模型,属于Phi-3系列的最新成员。这个模型经过精心训练,特别适合需要处理长文本和复杂…...

全任务零样本学习-mT5中文-base入门必看:温度系数对中文成语/俗语保留率影响

全任务零样本学习-mT5中文-base入门必看:温度系数对中文成语/俗语保留率影响 1. 模型介绍与核心价值 全任务零样本学习-mT5中文-base是一个专门针对中文文本增强优化的AI模型。它在原有mt5模型基础上,使用了海量中文数据进行深度训练,并引入…...

wan2.1-vae开发者手册:API接口调用方式+Python requests批量生成示例代码

wan2.1-vae开发者手册:API接口调用方式Python requests批量生成示例代码 如果你已经玩转了wan2.1-vae的Web界面,觉得一张张点生成不过瘾,或者想把它集成到自己的自动化工作流里,那你来对地方了。今天,我们就来聊聊怎么…...

Lychee Rerank MM代码实例:批量处理CSV文档并输出重排序JSON结果示例

Lychee Rerank MM代码实例:批量处理CSV文档并输出重排序JSON结果示例 1. 项目概述与核心价值 Lychee Rerank MM是一个基于Qwen2.5-VL多模态大模型构建的智能重排序系统,专门解决多模态检索场景中的精准匹配问题。想象一下,当你需要从海量文…...

ClearerVoice-Studio语音分离实战:16KHz AVI视频中精准分离4路说话人

ClearerVoice-Studio语音分离实战:16KHz AVI视频中精准分离4路说话人 1. 引言:当会议录音变成“一锅粥” 想象一下这个场景:你刚开完一个重要的项目会议,四位同事在会议室里热烈讨论,你录下了整段视频。但当你回放时…...

Chord视频分析效果对比:不同生成长度(128/512/2048)对定位精度影响

Chord视频分析效果对比:不同生成长度(128/512/2048)对定位精度影响 你是不是也遇到过这样的问题:用AI工具分析视频,让它找某个目标,结果要么说得太简单,漏掉了关键细节,要么说得太啰…...

Qwen-Image-2512实战案例:用‘悬浮亭子+云海’提示词生成水墨画风格高清图全过程

Qwen-Image-2512实战案例:用‘悬浮亭子云海’提示词生成水墨画风格高清图全过程 提示:本文以"悬浮亭子云海"为例,但您完全可以用同样的方法生成任何您想象的画面。关键在于学会如何用文字描述您想要的画面。 1. 快速了解Qwen-Image…...

Unsafe类

目录一、概述二、内存操作1.DirectByteBuffer类三、内存屏障四、CAS操作五、数组操作1.AtomicIntegerArray类六、线程调度1.AbstractQueuedSynchronizer类(AQS)一、概述 Unsafe类可以直接访问系统内存资源、自主管理内存资源,由于过于底层&a…...

RexUniNLU中文NLP系统保姆级教程:Gradio输入输出格式与调试技巧

RexUniNLU中文NLP系统保姆级教程:Gradio输入输出格式与调试技巧 1. 开篇:为什么需要这个教程 如果你正在使用或者打算使用RexUniNLU中文NLP系统,可能会遇到这样的困惑:明明模型能力很强,为什么我的输入总是得不到想要…...

Bidili Generator部署案例:高校AI实验室SDXL教学平台本地化部署实践

Bidili Generator部署案例:高校AI实验室SDXL教学平台本地化部署实践 1. 项目背景与需求 最近,我协助一所高校的AI实验室搭建了一套用于教学的图片生成平台。实验室负责人告诉我,他们之前尝试过一些在线AI绘画工具,但遇到了几个头…...

Nunchaku FLUX.1 CustomV3参数详解:CFG scale、steps、seed对Ghibsky风格影响

Nunchaku FLUX.1 CustomV3参数详解:CFG scale、steps、seed对Ghibsky风格影响 你是不是也遇到过这种情况:用同一个AI绘画模型,输入同样的描述词,别人生成的宫崎骏风格插画美轮美奂,而你的作品却总感觉差了点意思&…...

Qwen2.5-VL-7B-Instruct惊艳案例:乐谱图片→音符识别+演奏提示文字生成

Qwen2.5-VL-7B-Instruct惊艳案例:乐谱图片→音符识别演奏提示文字生成 你有没有想过,给AI一张乐谱图片,它不仅能告诉你上面是什么曲子,还能像一位经验丰富的音乐老师一样,告诉你该怎么演奏? 最近&#xf…...

Qwen3-4B-Thinking在DevOps提效场景:自动生成CI脚本、Dockerfile与测试用例案例分享

Qwen3-4B-Thinking在DevOps提效场景:自动生成CI脚本、Dockerfile与测试用例案例分享 1. 引言:当AI大模型遇上DevOps 如果你是一名开发者或运维工程师,下面这些场景你一定不陌生: 每次新建项目,都要从零开始写Docker…...

Nanbeige4.1-3B快速部署:镜像免配置+WebShell验证+提问测试三合一

Nanbeige4.1-3B快速部署:镜像免配置WebShell验证提问测试三合一 想体验一个推理能力强、对话自然的小尺寸开源大模型吗?今天给大家介绍一个“开箱即用”的解决方案——Nanbeige4.1-3B。它最大的特点就是部署极其简单,无需复杂的配置&#xf…...

Z-Image-Turbo-rinaiqiao-huiyewunv实操教程:批量生成任务队列管理与进度条反馈实现

Z-Image-Turbo-rinaiqiao-huiyewunv实操教程:批量生成任务队列管理与进度条反馈实现 1. 工具概述 Z-Image Turbo (辉夜大小姐-日奈娇)是一款基于Tongyi-MAI Z-Image底座模型开发的专属二次元人物绘图工具。该工具通过注入辉夜大小姐(日奈娇)微调权重,并…...

Stable Yogi Leather-Dress-Collection实战案例:动漫OST专辑封面皮衣主题视觉生成

Stable Yogi Leather-Dress-Collection实战案例:动漫OST专辑封面皮衣主题视觉生成 想象一下,你正在为一个虚拟偶像的动漫OST专辑设计封面。核心概念是“赛博朋克歌姬”,需要一位身着酷炫皮衣的动漫角色,背景是霓虹闪烁的未来都市…...

Streamlit+FP16+mPLUG-Owl3-2B:低成本多模态AI应用落地指南(附完整代码与避坑清单)

StreamlitFP16mPLUG-Owl3-2B:低成本多模态AI应用落地指南(附完整代码与避坑清单) 1. 项目简介 你是否遇到过这样的情况:想在自己的电脑上运行一个能看懂图片的AI助手,但要么模型太大跑不动,要么代码一堆报…...

基于低频FDTR的热界面材料导热性能与缺陷探测研究

🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 💌公众号:莱歌数字(B站同名) 📱个人微信:yanshanYH 211、985硕士,从业16年 从…...