什么是乐观锁?什么是悲观锁?

🔒 深入浅出:乐观锁 vs 悲观锁终极对决!面试必考知识点详解

各位CSDN的小伙伴们好呀!👋 我是雪碧聊技术,今天给大家带来高并发编程中的核心概念——乐观锁与悲观锁的深度解析!💻 无论你是准备面试,还是在实际开发中遇到并发问题,这篇文章都能帮你彻底搞懂这两种锁机制的本质区别和适用场景!🎯

⚔️ 为什么锁机制如此重要?

✅ 面试高频:90%的Java面试都会问到锁相关的问题
✅ 性能关键:选错锁类型可能导致系统吞吐量下降10倍!
✅ 实战必备:电商秒杀、库存扣减都依赖合理的锁策略
✅ 原理深入:从CAS到MVCC,掌握底层实现才能游刃有余

🧠 先来个小测试!(思考3秒钟)

❓ 假设有一个热门商品库存扣减场景,你会选择:
A. 直接用synchronized锁住整个方法
B. 使用数据库乐观锁(version字段)
C. 使用Redis分布式锁

(答案藏在文中,继续往下看哦~)👇

📚 核心内容抢先看

🔐 悲观锁:我预判你会冲突

  • 🛡️ 核心思想:"先加锁,再操作"
  • 🏦 典型实现:synchronizedReentrantLockSELECT FOR UPDATE
  • 📉 优缺点分析:
    • 👍 保证强一致性
    • 👎 并发性能较差(线程阻塞)
  • 🏷️ 适用场景:
    • 写多读少
    • 临界区代码执行时间长

🌞 乐观锁:我相信你不会冲突

  • ✨ 核心思想:"先操作,发现冲突再处理"
  • 🧪 典型实现:CAS原子类、MySQL version机制、MVCC
  • 📈 优缺点分析:
    • 👍 高并发性能好
    • 👎 可能引发重试开销
  • 🏷️ 适用场景:
    • 读多写少
    • 冲突概率低

🥊 终极对比表格

维度悲观锁 🔒乐观锁 ☀️
并发性能⭐⭐⭐⭐⭐⭐⭐
实现复杂度⭐⭐⭐⭐⭐
适用场景写多读少读多写少
典型应用银行转账商品库存

💡 黄金实践建议

  1. MySQL场景

    • 高并发更新 ➡️ 乐观锁(version字段)
    • 金额操作 ➡️ 悲观锁(FOR UPDATE)
  2. Java代码层面

    • 简单逻辑 ➡️ synchronized
    • 高性能需求 ➡️ AtomicInteger等原子类
  3. 分布式系统

    • Redis实现的乐观锁(WATCH/MULTI/EXEC)
    • Zookeeper分布式锁

💬 互动时间:你更偏爱乐观锁还是悲观锁?为什么?欢迎在评论区Battle!🗣️

🔔 温馨提示:收藏本文(Ctrl+D),面试前复习效果更佳!文中所有代码示例都经过Java 11验证~

目录

一.乐观锁

1.定义

2.大体流程

3.乐观锁的实现

4.总结

二.悲观锁

1.定义

2.大体流程

3.悲观锁的实现

4.缺点

5.总结


一.乐观锁

1.定义

乐观锁在操作数据时非常乐观,认为别的线程不会同时修改数据,所以并不会上锁,但是在更新的时候会判断一下在此期间别的线程有没有更新过这个数据。

2.大体流程

3.乐观锁的实现

4.总结

乐观锁适合操作多的场景,不加锁的特点能使其读操作的性能大幅提升。

二.悲观锁

1.定义

悲观锁在操作数据时比较悲观,每次去拿数据的时候认为别的线程也会同时修改数据,所以每次在拿数据的时候都会上锁,这样别的线程想拿这个数据就会阻塞直到它拿到锁。

2.大体流程

3.悲观锁的实现

4.缺点

  • 需要阻塞,导致效率低下
  • 可能造成某个线程永久等待,即发生死锁的可能性比较大

5.总结

悲观锁适合并发写入操作多的场景,先加锁再进行写操作,能保证写操作的数据正确性。

以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89371.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML前端性能优化完整指南

图片优化:性能优化的重中之重 重新审视图片的必要性 在开始优化之前,首先需要思考一个根本问题:要实现预期的视觉效果,真的需要使用图片吗? 随着Web技术的快速发展,许多以往只能通过图片实现的效果&…

数据炼金术:用Python做智能数据整理员

数据炼金术:用Python做智能数据整理员 解锁自动化魔法:文件批量重命名Excel智能清洗数据净化全流程实战 一、数据整理的困境与破局之道 你是否面临这些数据噩梦场景? 🧩 ​​混乱文件目录​​:最终版_报告_V4(1).doc…

HTML基础P1 | HTML基本元素

HTML标签标签名放在<>中&#xff0c;如<body>大部分标签成对出现&#xff0c;如<h1>为开始标签&#xff0c;</h1>为其对应的结束标签&#xff0c;少数标签只有开始标签&#xff0c;如换行标签<br/>&#xff0c;成为"单标签"有的标签中…

LVS集群搭建

集群是为了解决某个特定问题将多台计算机组合起来形成的单个系统知识点&#xff1a;1.关键术语&#xff1a;VS&#xff1a;Virtual Server&#xff08;调度器&#xff09;RS&#xff1a;Real Server&#xff08;真实服务器&#xff09;CIP&#xff1a;Client IP&#xff08;客户…

吴恩达《AI for everyone》第一周课程笔记

课程的核心目标&#xff1a;- AI是什么&#xff1f; - AI能做什么&#xff1f; - AI最擅长什么类型的任务&#xff1f; - AI怎么做决策&#xff1f; - 企业为什么需要AI战略&#xff1f;导航Machine Learning 机器学习> 最常见的机器学习类型&#xff1a; > 人工智能中最…

iOS App 电池消耗管理与优化 提升用户体验的完整指南

在当今智能手机的使用中&#xff0c;电池寿命和续航能力是用户选择App时的重要考虑因素之一。iOS设备的电池管理功能较为封闭&#xff0c;这也让开发者、产品经理以及普通用户对于App的电池消耗有时无法全面了解。而如果你的App因电池消耗过快而遭到用户卸载&#xff0c;无论功…

关于用git上传远程库的一些常见命令使用和常见问题:

克隆远程库gitee到本地用命令git clone git clone https://gitee.com/automated-piggy-senior/20250717-test.gitLinux/macOS 终端&#xff1a; 执行 touch readme.txt&#xff08;创建空文件&#xff09;&#xff0c;或 echo "这是说明文件" > readme.txt&#…

想删除表中重复数据,只留下一条,sql怎么写

PostgreSQL 方法: DELETE FROM tbl_case_model WHERE id NOT IN (SELECT MIN(id) -- 保留id最小的记录FROM tbl_case_modelGROUP BYcolumn1, -- 替换为实际重复列名column2, -- 继续添加重复列... -- [所有需要比较的列] );因为我这次遇到的情况比较特殊&#xff0…

微服务中token鉴权设计的4种方式

1. JWT鉴权 「概述」&#xff1a;JWT是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。它基于JSON格式&#xff0c;包含三个部分&#xff1a;头部&#xff08;Header&#xff09;、负载&#xff08;Payload&#xff09;和签名&#xff08;Signature&#xff09;。J…

nodejs搭建

1.创建一个空文件夹&#xff0c;在vscode中打开 2.执行命令开启package文件 npm init -y3.设置根目录文件app.js 先执行 npm install express 命令安装 express 模块 执行 npm install cors 命令安装 cors 模块 // app.js const express require(express) const app express…

frp内网穿透(二)

frp内网穿透&#xff08;二&#xff09; 前言 前篇内网穿透 上面一文中已描述如何安装frp进行内网穿透&#xff0c;并配置ssh穿透连接内网服务器&#xff0c;本篇主要介绍如何配置web服务 使用场景 A服务器为公网服务器&#xff0c;B服务器为家庭中内网服务器&#xff0c;且B…

Spring 应用中 Swagger 2.0 迁移 OpenAPI 3.0 详解:配置、注解与实践

从 Swagger 2.0 到 OpenAPI 3.0 的升级指南 为什么升级 OpenAPI 3.0提供了更强大的功能、更简洁的配置和更好的性能&#xff0c;同时保持了与 Swagger 2.0 的基本兼容性。本文将详细介绍升级的各个步骤&#xff0c;并提供代码示例。 1. 依赖管理的变化 Swagger 2.0 依赖配置 &l…

用 Flink CEP 打造实时超时预警:从理论到实战

目录 1. Flink CEP 是什么?为什么它能让你的数据“开口说话”? 2. 超时预警的业务场景:从电商到物联网 3. Flink CEP 超时机制的核心原理 3.1 模式匹配与时间窗口 3.2 超时事件的处理 3.3 事件时间与水位线 3.4 核心组件一览 4. 实战案例:电商订单超时预警 4.1 准备…

Rocky Linux 9 源码包安装php7

Rocky Linux 9 源码包安装php7大家好&#xff01;我是星哥。尽管现在 PHP 版本已迭代至 8.x&#xff0c;但有时为了兼容遗留系统或特定应用需求&#xff0c;我们仍需部署特定版本的 PHP。最主要的是之前的项目采用的PHP7.3&#xff0c;未来兼容旧的项目&#xff0c; 今天&#…

uniapp+vue3+鸿蒙系统的开发

前言&#xff1a; uniappvue3鸿蒙系统的开发。 实现效果&#xff1a; 鸿蒙pad端真机测试效果-下面是正常的日志效果 实现步骤&#xff1a; 1、安装鸿蒙的开发工具&#xff0c;点击安装&#xff0c;注意版本不能太旧了 deveco-studio 2、下载下来是个压缩包&#xff0c;解压后…

【C++类和对象解密】面向对象编程的核心概念(下)

之前我们了解到构造函数是在对象实例化之时对对象完成初始化工作的一个函数。在我们不写时&#xff0c;编译器会自动生成构造函数。构造函数有一些特点&#xff0c;比如&#xff0c;他对内置类型不做处理&#xff0c;对自定义类型的成员会去调用其自身的构造。我们上篇文章还提…

Flutter基础(前端教程①②-序列帧动画)

&#x1f9e0; 核心思路总结​​彻底绕过 Image组件重建带来的性能瓶颈​​&#xff1a;不再让 setState重建包含 Image的 Widget 树&#xff08;这是开销大、可能导致闪烁的根源&#xff09;&#xff0c;改为使用底层画布 (Canvas) 直接绘制预先处理好的图像帧数据。好的&…

Qt添加dmp文件生成及pdb文件

1.Pdb文件生成 下图先通过构建生成Pdb文件&#xff0c;然后运行程序&#xff0c;通过提前准备的崩溃按钮使得程序崩溃&#xff0c;生成“dump文件”的演示。 # #添加dmp文件生成及pdb文件生成DEFINES QT_MESSAGELOGCONTEXT DEFINES QT_DEPRECATED_WARNINGS# # 添加DUMP文件…

opencv、torch、torchvision、tensorflow的区别

一、框架定位与核心差异PyTorch动态计算图&#xff1a;实时构建计算图支持Python原生控制流&#xff08;如循环/条件&#xff09;&#xff0c;调试便捷。学术主导&#xff1a;2025年工业部署份额24%&#xff0c;适合快速原型开发&#xff08;如无人机自动驾驶、情绪识别&#x…

离散与组合数学 杂记

生成函数 概念 又称母函数把一个无穷数列 {an}\{a_n\}{an​}&#xff08;默认从 000 项起&#xff09;表示成 G(x)∑i≥0aixiG(x)\displaystyle\sum_{i\ge0} a_ix^iG(x)i≥0∑​ai​xi 的函数形式。例如&#xff1a; ai2ia_i2^iai​2i&#xff1a;G(x)∑i≥02ixiG(x)\display…