19.悲观锁与乐观锁解析
1.悲观锁
悲观锁比较悲观,它认为如果不锁住这个资源,别的线程就会来争抢,就会造成数据结果错误,所以悲观锁为了确保结果的正确性,会在每次获取并修改数据时,都把数据锁住,让其他线程无法访问该数据,这样就可以确保数据内容万无一失。
举个例子
- 假设线程 A 和 B 使用的都是悲观锁,所以它们在尝试获取同步资源时,必须要先拿到锁。
- 假设线程 A 拿到了锁,并且正在操作同步资源,那么此时线程 B 就必须进行等待。
- 而当线程 A 执行完毕后,CPU 才会唤醒正在等待这把锁的线程 B 再次尝试获取锁。
- 如果线程 B 现在获取到了锁,才可以对同步资源进行自己的操作。这就是悲观锁的操作流程。
2.乐观锁
乐观锁比较乐观,认为自己在操作资源的时候不会有其他线程来干扰,所以并不会锁住被操作对象,不会不让别的线程来接触它,同时,为了确保数据正确性,在更新之前,会去对比在我修改数据期间,数据有没有被其他线程修改过:如果没被修改过,就说明真的只有我自己在操作,那我就可以正常的修改数据;
如果发现数据和我一开始拿到的不一样了,说明其他线程在这段时间内修改过数据,那说明我迟了一步,所以我会放弃这次修改,并选择报错、重试等策略。
乐观锁的实现一般都是利用 CAS 算法实现的。
举个例子:
- 假设线程 A 此时运用的是乐观锁。那么它去操作同步资源的时候,不需要提前获取到锁,而是可以直接去读取同步资源,并且在自己的线程内进行计算。
- 当它计算完毕之后、准备更新同步资源之前,会先判断这个资源是否已经被其他线程所修改过。
- 如果这个时候同步资源没有被其他线程修改更新,也就是说此时的数据和线程 A 最开始拿到的数据是一致的话,那么此时线程 A 就会去更新同步资源,完成修改的过程。
- 而假设此时的同步资源已经被其他线程修改更新了,线程 A 会发现此时的数据已经和最开始拿到的数据不一致了,那么线程 A 不会继续修改该数据,而是会根据不同的业务逻辑去选择报错或者重试。
3.相关用法
悲观锁:synchronized 关键字和 Lock 接口
Java 中悲观锁的实现包括 synchronized 关键字和 Lock 相关类等,我们以 Lock 接口为例,例如 Lock 的实现类 ReentrantLock,类中的 lock() 等方法就是执行加锁,而 unlock() 方法是执行解锁。处理资源之前必须要先加锁并拿到锁,等到处理完了之后再解开锁,这就是非常典型的悲观锁思想。
乐观锁:原子类
乐观锁的典型案例就是原子类,例如 AtomicInteger 在更新数据时,就使用了乐观锁的思想,多个线程可以同时操作同一个原子变量。
数据库
- 数据库中同时拥有悲观锁和乐观锁的思想。例如,我们如果在 MySQL 选择 select for update 语句,那就是悲观锁,在提交之前不允许第三方来修改该数据,这当然会造成一定的性能损耗,在高并发的情况下是不可取的。
- 相反,我们可以利用一个版本 version 字段在数据库中实现乐观锁。在获取及修改数据时都不需要加锁,但是我们在获取完数据并计算完毕,准备更新数据时,会检查版本号和获取数据时的版本号是否一致,如果一致就直接更新,如果不一致,说明计算期间已经有其他线程修改过这个数据了,那我就可以选择重新获取数据,重新计算,然后再次尝试更新数据。
UPDATE studentSET name = ‘小李’,version= 2WHERE id= 100AND version= 1
4.使用场景
悲观锁适合用于并发写入多、临界区代码复杂、竞争激烈等场景,这种场景下悲观锁可以避免大量的无用的反复尝试等消耗。
乐观锁适用于大部分是读取,少部分是修改的场景,也适合虽然读写都很多,但是并发并不激烈的场景。在这些场景下,乐观锁不加锁的特点能让性能大幅提高。
相关文章:
19.悲观锁与乐观锁解析
1.悲观锁 悲观锁比较悲观,它认为如果不锁住这个资源,别的线程就会来争抢,就会造成数据结果错误,所以悲观锁为了确保结果的正确性,会在每次获取并修改数据时,都把数据锁住,让其他线程无法访问该…...
C语言--给出一个点的坐标判断它在单位圆的内部外部还是上面
一.题目描述 给出一个点的坐标判断它在单位圆的内部外部还是上面 例如输入1,0,输出在圆上 二.思路分析 首先,单位圆是以坐标系原点为圆心、半径为1的圆。 给定一个点坐标 (x,y),我们可以使用勾股定理计算该点到坐标系原点的距…...
变频器基础问答集21-50
21.请问电机软起动器是否能节能?软启动节能效果有限,但可以减少启动对电网的冲击,也可以实现平滑启动,保护电机机组。 根据能量守恒理论,由于加入了相对复杂的控制电路,软启动不但不节能,还会加大能量的消耗,但它可以减小电路的启…...
OpenCvSharp从入门到实践-(01)认识OpenCvSharp开发环境搭建
目录 一、OpenCV 二、OpenCvSharp 三、OpenCvSharp开发环境搭建 四、下载 五、其他 一、OpenCV OpenCV是基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习函数库,支持Windows、Linux、Android和Mac OS操作系统。OpenCV由一系…...
OSG文字-渐变文字(4)
渐变文字(osgText::FadeText类)继承自osgText::Text类继承关系图如图9-6所示 图9-6 osgText::FadeText的继承关系图 从继承关系图中可以看出,它继承自osgText::Text类,因此,它具备一般文字属性的设置方法这里不再重复说明。创建渐变文字与一般…...
排查生产环境:MySQLTransactionRollbackException数据库死锁
一. 问题现状 程序直接宕机,并在error.log日志中发现大量的报错日志,如下: ### Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting trans…...
140.【鸿蒙OS开发-01】
鸿蒙开发 (一)、初识鸿蒙1.初识鸿蒙(1).移动通讯技术的发展(2).完整的鸿蒙开发 (二)、鸿蒙系统介绍1.鸿蒙系统的官方定义(1).鸿蒙操作系统概述(2).鸿蒙的生态 2.鸿蒙系统的特点3.鸿蒙和安卓的对比4.鸿蒙开发的发展前景 (三)、鸿蒙开发准备工作1.鸿蒙OS的完整开发流程2.注册并实…...
npm install 下载不下来依赖解决方案
背景 最近在构建 前端自动化部署 的方案中发现了一个问题,就是我在npm install的时候,有时候成功,有时候不成功,而且什么代码也没发生更改,报错也就是那么几个错,所以在此也整理了一下遇到这种情况…...
接口自动化中cookies的处理技术
一,理论知识 为什么有cookie和session? 因为http协议是一种无状态的协议,即每次服务端接受到客户端的请求时都时一个全新的请求,服务器并不知道客户端的请求记录,session和cookie主要目的就是弥补http的无状态特性 …...
PHP 安装
您需要做什么? 为了开始使用 PHP,您可以: 找一个支持 PHP 和 MySQL 的 Web 主机在您自己的 PC 机上安装 Web 服务器,然后安装 PHP 和 MySQL 使用支持 PHP 的 Web 主机 如果您的服务器支持 PHP,那么您不需要做任何事情…...
小程序常见操作
测试时访问本地http服务器调用报错 微信开发者工具(右上角)-> 详情->本地设置->不校验合法域名、web-view(业务域名)... -> 去除勾选使用npm包 1) 工程目录下创建package.jsonnpm init(手动完成设定) / npm init -y (默认设定) 2) 安装 np…...
STM32F4串口USART发送为00的解决方案
检查接线是否正确检查TX是否为复用推挽输出 3.检查是否将TX和RX引脚重映射为USART功能 在STM32中,每个GPIO引脚可以配置为不同的复用功能,例如UART、SPI、I2C等。具体来说,GPIO_PinAFConfig函数用于配置GPIO引脚的复用功能。它的参数包括GPIO…...
重磅解读 | 阿里云 云网络领域关键技术创新
云布道师 10 月 31 日,杭州云栖大会,阿里云技术主论坛带来了一场关于阿里云主力产品与技术创新的深度解读,阿里云网络产品线负责人祝顺民带来《云智创新,网络随行》的主题发言,针对阿里云飞天洛神云网络(下…...
【蓝桥杯省赛真题45】Scratch九宫格游戏 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解
目录 scratch九宫格游戏 一、题目要求 编程实现 二、案例分析 1、角色分析...
物联网AI MicroPython学习之语法 ADC数模模块
学物联网,来万物简单IoT物联网!! ADC 介绍 模块功能: ADC数模转换模块 ADC功能在ESP32引脚32-39上可用,使用默认配置时,ADC引脚上的输入电压必须介于0.0v和1.0v之间(任何高于1.0v的值都将读为4095&#x…...
详解Python中哈希表的使用。站在开发者角度,与大家一起探究哈希的世界。
文章目录 1. 前言2. 哈希表2.1 哈希函数2.2 哈希算法2.3 常见哈希算法2.4 哈希冲突 3.总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面…...
详解python淘宝秒杀抢购脚本程序实现
文章目录 前言一、官网下载火狐浏览器二、下载geckodriver,并解压到火狐浏览器文件夹根目录三、添加火狐浏览器根目录到系统环境变量四、下载并安装python及pycharm开发工具五、进入淘宝六、使用Pycharm运行脚本,新建python文件,将代码复制到…...
使用ChatGPT创建Makefile构建系统:使用Make运行Docker
使用ChatGPT创建Makefile构建系统:使用Make运行Docker 芯语芯愿(知乎/纷传/CSDN/);小石头的芯语芯愿(微信公众号) 开发高效现代的构建系统对于满足开发周期需求至关重要。原先,嵌入式开发者一…...
算法设计与分析复习--分支界限法
文章目录 上一篇分支界限法性质装载问题0-1背包问题单源最短路问题最大团问题下一篇 上一篇 算法设计与分析复习–回溯法(二) 分支界限法性质 分支界限法是按广度优先策略或最小耗费优先遍历问题的解空间树。 搜索解空间: 子集树排列树 …...
Https攻击怎么防御
随着互联网技术的发展,网站所遭受的网络攻击频率也在不断上升。某种程度上,我们可以说互联网上的每个网站都容易遭受安全攻击。因为网络攻击者最主要的动机是求财。无论你运营的是电子商务项目还是简单的小型商业网站,潜在攻击的风险就在那里…...
ROPES:嵌入式系统开发的模型驱动方法论
1. ROPES:嵌入式系统开发的革命性方法论在嵌入式系统开发领域,我们常常面临一个核心矛盾:如何在高可靠性的硬实时要求与快速迭代的市场需求之间找到平衡?传统瀑布式开发周期长、反馈慢,而完全敏捷的方法又难以满足嵌入…...
微信聊天记录永久备份终极指南:简单三步搞定珍贵回忆
微信聊天记录永久备份终极指南:简单三步搞定珍贵回忆 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失、系统升级或误操作而丢失珍贵的微信…...
绍兴商家们如何选择可靠的AI推广服务商
在2026年,选择可靠的AI推广(GEO, 生成式引擎优化)服务商对于企业来说至关重要。这不仅涉及到技术实力的考量,还需考虑本地化服务、效果量化能力以及合规性等因素。基于对绍兴市场背景及行业痛点的理解,以下是为企业提供…...
国产替代之FQD30N06TM与VBE1638参数对比报告
N沟道功率MOSFET参数对比分析报告 一、产品概述 FQD30N06TM (onsemi):N沟道增强型功率MOSFET,采用平面条形和DMOS技术,旨在降低导通电阻,并提供优异的开关性能和高雪崩能量强度。耐压60V,典型导通电阻低至36mΩ。封装…...
Pycharm效率翻倍秘籍:从文件模板、字体缩放快捷键到中文插件完整配置流程
PyCharm效率翻倍秘籍:从文件模板到中文插件的终极配置指南 每次打开PyCharm,你是否总在重复那些机械操作?创建新文件要手动添加注释头,调试代码时频繁调整字体大小,面对全英文界面还要分心查词典。这些看似微小的效率损…...
如何快速安装和配置QLMarkdown:新手入门教程
如何快速安装和配置QLMarkdown:新手入门教程 【免费下载链接】QLMarkdown macOS Quick Look extension for Markdown files. 项目地址: https://gitcode.com/gh_mirrors/qlm/QLMarkdown QLMarkdown是一款专为macOS设计的Quick Look扩展工具,能帮助…...
为什么你的MCP 2026策略总在凌晨2点崩溃?揭秘策略编译器内存泄漏+上下文注入漏洞双触发机制
更多请点击: https://intelliparadigm.com 第一章:MCP 2026细粒度权限动态管控配置概览 MCP 2026 是新一代云原生权限治理框架,其核心能力在于支持运行时策略注入、属性基访问控制(ABAC)与上下文感知决策引擎的深度融…...
从Word迁移到LaTeX:如何像处理Word一样轻松管理你的图片、表格和公式?
从Word到LaTeX的无缝迁移:图片、表格与公式的高效管理指南 第一次接触LaTeX的Word用户往往会感到手足无措——那些熟悉的拖拽操作和可视化工具突然变成了需要记忆的代码命令。但别担心,LaTeX的代码化操作实际上提供了一种更精确、更自动化的文档控制方式…...
ZYNQ HDMI显示避坑指南:从VGA到HDMI,我踩过的那些缓存一致性“坑”
ZYNQ HDMI显示开发中的缓存一致性陷阱与实战解决方案 在嵌入式视频处理领域,ZYNQ系列SoC因其独特的ARM处理器与FPGA可编程逻辑结合架构,成为高清视频接口开发的理想选择。然而,当工程师们从相对简单的VGA接口转向HDMI开发时,往往会…...
手把手教你用Vivado 2019.1在Kintex-7上搭建10G UDP协议栈(附12套源码)
Kintex-7 FPGA实战:从零构建10G UDP通信系统的完整指南 当我在实验室第一次看到Kintex-7开发板通过10G光纤传输数据时,那种流畅的数据流简直令人着迷。不同于传统的千兆以太网,10G网络带来的性能飞跃让实时高清视频传输、高速数据采集等应用成…...
