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

什么是悲观锁?原理、使用场景与实战详解

在并发编程和数据库开发中,“锁”是一个绕不开的话题。其中,悲观锁是一种非常经典、也非常重要的并发控制机制。本文将从概念、原理、实现方式、使用场景和代码示例多个角度介绍什么是悲观锁。


文章目录

    • 一、什么是悲观锁?
      • 1. 悲观锁的定义
      • 2. 通俗理解
    • 二、悲观锁的工作原理
    • 三、悲观锁的主要实现方式
      • 1. 数据库层面的悲观锁
      • 2. Java 中的悲观锁(synchronized)
      • 3. ReentrantLock(显式锁)
    • 四、悲观锁 vs 乐观锁
    • 五、悲观锁的典型使用场景
      • 1. 高冲突写场景
      • 2. 对一致性要求极高的系统
    • 六、实战案例:库存扣减
      • 1. 错误示例(无锁)
      • 2. 悲观锁实现
    • 七、悲观锁的优缺点分析
      • 优点
      • 缺点
    • 八、使用悲观锁的注意事项
      • 1. 控制锁的粒度
      • 2. 避免死锁
      • 3. 减少锁持有时间
    • 九、面试常见问题
      • 1. 什么是悲观锁?
      • 2. 什么时候用悲观锁?
      • 3. 悲观锁一定安全吗?
    • 参考

一、什么是悲观锁?

1. 悲观锁的定义

悲观锁(Pessimistic Lock),是一种对并发冲突持“悲观态度”的锁机制。

它的核心思想是:

总是认为并发操作一定会发生冲突,因此在操作数据前先加锁。

只要我在用数据,就不允许别人修改。


2. 通俗理解

可以把悲观锁理解为:

  • “先上锁,再干活”
  • “宁可等,也不乱”

就像公共洗手间:

进去先反锁,出来再开门。

别人只能等你用完。


二、悲观锁的工作原理

悲观锁的基本流程如下:

  1. 线程/事务申请锁
  2. 获取成功后进入临界区
  3. 执行业务操作
  4. 提交事务并释放锁
  5. 其他线程继续执行

流程示意:

线程A:加锁 → 操作 → 解锁 线程B:等待 → 加锁 → 操作 → 解锁

本质上:

同一时间只允许一个线程操作共享资源。


三、悲观锁的主要实现方式

1. 数据库层面的悲观锁

在数据库中,悲观锁主要通过SELECT ... FOR UPDATE实现。

示例(MySQL):

SELECT*FROMaccountWHEREid=1FORUPDATE;

特点:

  • 查询时直接加行锁
  • 事务提交后释放
  • 其他事务无法修改该行

适用于高并发写场景。


2. Java 中的悲观锁(synchronized)

synchronized是 Java 中最经典的悲观锁实现。

示例:

publicsynchronizedvoidadd(){count++;}

特点:

  • 自动加锁和释放
  • 阻塞式等待
  • 性能稳定

3. ReentrantLock(显式锁)

ReentrantLock属于更灵活的悲观锁。

示例:

Locklock=newReentrantLock();lock.lock();try{count++;}finally{lock.unlock();}

优势:

  • 可中断
  • 可超时
  • 支持公平锁

四、悲观锁 vs 乐观锁

理解悲观锁,必须对比乐观锁。

对比维度悲观锁乐观锁
并发态度悲观乐观
是否加锁否(通常)
冲突处理阻塞等待重试
性能稳定高并发下更优
实现方式锁机制CAS / 版本号

一句话总结:

冲突多用悲观锁,冲突少用乐观锁。


五、悲观锁的典型使用场景

1. 高冲突写场景

例如:

  • 库存扣减
  • 账户转账
  • 秒杀下单

这些场景下:

写多、冲突多、数据敏感。

适合使用悲观锁。


2. 对一致性要求极高的系统

例如:

  • 金融系统
  • 支付系统
  • 订单系统

不能出现脏数据,宁可慢一点。


六、实战案例:库存扣减

1. 错误示例(无锁)

if(stock>0){stock--;}

可能导致超卖。


2. 悲观锁实现

publicsynchronizedbooleanreduceStock(){if(stock>0){stock--;returntrue;}returnfalse;}

保证同一时间只有一个线程执行。


七、悲观锁的优缺点分析

优点

  • 实现简单
  • 数据安全性高
  • 不容易出错
  • 逻辑清晰

缺点

  • 并发性能较差
  • 容易产生阻塞
  • 可能导致死锁
  • 吞吐量受限

八、使用悲观锁的注意事项

1. 控制锁的粒度

  • 锁太大:性能差
  • 锁太小:复杂度高

建议:

尽量缩小锁范围。


2. 避免死锁

常见死锁原因:

  • 锁顺序不一致
  • 嵌套锁

建议统一加锁顺序。


3. 减少锁持有时间

锁内代码越少越好。

不要在锁里做:

  • 网络请求
  • IO 操作
  • 复杂计算

九、面试常见问题

1. 什么是悲观锁?

答:

操作前先加锁,假设一定发生冲突。


2. 什么时候用悲观锁?

答:

高并发写、多冲突、强一致场景。


3. 悲观锁一定安全吗?

答:

逻辑正确前提下安全,但可能死锁。


参考

悲观锁和乐观锁 - 迷失的布莱克 - 博客园

Java并发常见面试题总结(中)

http://www.jsqmd.com/news/381832/

相关文章:

  • Java juc 3 共享模型之管程
  • 2005-2023年世界各国关税数据
  • 钢琴搬运哪家强?2026年上海钢琴搬运公司推荐与排名,解决专业性与时效性核心痛点 - 十大品牌推荐
  • 2026年上海家庭搬家公司推荐:市场趋势与服务标准评测,涵盖长途与同城场景核心痛点 - 十大品牌推荐
  • 未来属于Agentic AI:释放人工智能在药企医学洞察中的潜力
  • 济南小型搬家公司哪个好?2026年济南小型搬家公司推荐与排名,解决效率与保障核心痛点 - 十大品牌推荐
  • Chonkie 技巧深度学习
  • 一个28美元的零件如何让500万美元的机器瘫痪—— 知识图谱增强大模型如何阻止它
  • 人工智能本体论:大模型辅助构建AI概念层级体系
  • 油脱党实测2026防脱控油洗发水排名,临床数据验证,全肤质适配首选 - 资讯焦点
  • 2026年英语四六级培训服务排名,颜语堂教育咨询费用合理 - myqiye
  • 昆明诚信的软装设计品牌企业费用多少,性价比揭秘 - 工业推荐榜
  • 2026年上海家具搬运公司推荐:基于企业搬迁实测评价,针对效率低下与安全隐忧精准指南 - 十大品牌推荐
  • 看完就会:当红之选的降AI率软件 —— 千笔·专业降AIGC智能体
  • 2026年昆明一站式整体搭配软装企业排行榜,快来看看有哪些品牌 - 工业设备
  • 上海家电搬运哪家强?2026年上海家电搬运公司全面推荐与评价,解决包装与理赔痛点 - 十大品牌推荐
  • 2026年广州小型搬家公司推荐:市场服务趋势评测,涵盖家庭与企业搬迁场景核心痛点 - 十大品牌推荐
  • 解析长沙像素壹佰评价如何,从案例看教学实力和就业成果 - 工业品牌热点
  • 人工智能之数学基础:先验分布、后验分布、极大似然
  • 颜语堂考研数学课程拓展丰富吗,考研数学辅导性价比大比拼 - myqiye
  • 汇川AM401系列程序 汇川AM403程序,搭配汇川总线伺服,汇川IT7070系列触摸屏 全自...
  • 相臣律所卢彦民离婚律师处理复杂案件能力强吗,价格贵不贵 - 工业推荐榜
  • 2026年济南家电搬运公司推荐:专业服务趋势评测,涵盖家庭与企业场景搬运痛点 - 十大品牌推荐
  • 分析车间降温施工要点,威昌达实力凸显 - mypinpai
  • 2026昆明靠谱软装公司推荐,优选软装的精选软装值得选吗 - 工业设备
  • 2026年推荐系统专利AI价格大揭秘,哪家费用更合理 - 工业品网
  • 用K线API构建可交互行情面板:历史数据加载与实时更新实践
  • 2026年济南钢琴搬运公司推荐:基于多场景实测评价,针对钢琴安全与效率痛点精准指南 - 十大品牌推荐
  • 想对接 GEO 服务?上海智推时代正规联系方式请收好 - 速递信息
  • 2026年广州家庭搬家公司推荐:基于多场景服务评价,针对效率低下与安全隐忧痛点精准指南 - 十大品牌推荐