悲观锁和乐观锁详细
悲观锁和乐观锁详细
悲观锁
悲观锁就是悲观的思想,他认为数据每一次被访问的时候都会被上锁,所以每次获得锁的时候都会上锁,这样其他线程想要获取这个锁的时候就会被堵塞,要等待上一个线程锁的释放。也就是说这个线程只一次只给一个线程使用,其他线程会被堵塞。当上一个线程使用完其他线程就可以竞争到这个锁。
在高并发的场景下,激烈的锁景长会造成线程堵塞,大佬的堵塞线程会导致线程的上下文切换,会增加系统性能的消耗,而且悲观锁还有可能存在死锁的问题,影响代码的运行。
悲观锁的每次开销是固定的。
什么是乐观锁
乐观锁每次都是假设的最好的情况,它认为资源每次被访问的时候不会被修改,线程可以不停的执行,无序加锁无序等待,只是提交修改数据的时候需要验证一下我们的医院是否被其他的县城修改了(下面CAS算法会详细介绍)。比如我们的AtomicInteger、LongAdder就是使用我们乐观锁的思想。
在高并发中,乐观锁不会出现线程堵塞和思索的问题,性能会比悲观锁性能更好一点,但是如果突然频繁发生写占比非常多的业务情况,回频繁失败和重试,这就会造成我们CPU飙升,影响我们的应能。乐观锁的使用场景都是写比较少的地方。
在我们乐观锁是使用了版本号机制和CAS算法实现的, 但是内部使用的CAS算法更多一点。
版本号控制器
版本号就是在数据表种加一个数据版本号version字段,如果我们的数据修改成功我们的version会自加1。当线程A要更新数据的时候,会读取当前的版本号,在提交数据的时候会拿我们读到的版本号和我们表种的版本号是否一样,如果一样的话就会更新,然后version++,否则就重试更新操作直到更新成功。
CAS算法
CAS就是Compare And Swap(比较与交换),用户乐观锁当中,被广泛用到个大框架,CAS的思想很简单,就是用一个预期值和要更新的值进行比较,两者相等就会更新
CAS是一个原子操作,底层依赖一条CPu的原子指令。
原子操作就是一旦开始就不能被打断,直到操作完成
CAS(Compare And Swap)涉及到3哥操作数
**V:**需要更新的变量值
E: 预期的值
**N:**拟写入的新值(新的值)
当V的值等于E的时候,CAS会通过原子方式用N来更新V,如果不相等那么就说明其他线程更新了V,当前线程就会放弃更新。
乐观锁存在的问题
ABA问题
ABA的问题i就是我们乐观锁最常见的问题。如果一个变量V初次读取的时候是A,然后准备赋值的时候检查也是A,这个时候我们不能说明它没有被其他线程修改过,因为很可能这时候其他线程把这个值修改成了B,然后有被修改成A,这时候CAS就会判定他没有被修改。
ABA的解决思路是在变量前面追加一个时间戳,在JDK1.5以后的AtomicStampedReference类就是用来解决ABA问题的,其中的compareAndSet就是检测我们当前的引用是否等于预期的引用,如果标志相等就更新。
循环时间长开销大。
因为CAs经常会用到自选操作进行重试,如果不成功就会循环执行到成功为止,如果长时间不成功就会给我们的CPU带来很大的压力。
只能对一个共享变量进行原子操作
CAS支队单个贡献变量优先,当操作涉及多个共享变量的时候CAS就会无效,但是JDK1.5的时候开始,提供了AtomicReference类保证引用对象之间的原子性,我们也可以把多个变量放到一个对线里进行CAS操作,所以我们可以使用锁或者利用AtomicReference类把多个共享变量合并成一个共享变量进行操作。
相关文章:
悲观锁和乐观锁详细
悲观锁和乐观锁详细 悲观锁 悲观锁就是悲观的思想,他认为数据每一次被访问的时候都会被上锁,所以每次获得锁的时候都会上锁,这样其他线程想要获取这个锁的时候就会被堵塞,要等待上一个线程锁的释放。也就是说这个线程只一次只…...
三谈ChatGPT(ChatGPT可以解决问题的90%)
这是我第三次谈ChatGPT,前两篇主要谈了ChatGPT的概念,之所以火的原因和对人们的影响,以及ChatGPT可能存在的安全风险和将面临的监管问题。这一篇主要讲讲ChatGPT的场景和处理问题的逻辑。 这一次我特意使用了ChatGPT中文网页版体验了一番。并…...
Qt QSet 详解:从底层原理到高级用法
目录标题 引言:QSet的重要性与简介QSet 的常用接口迭代器:遍历Qset 中的元素(Iterators: Traversing Elements in Qset )高级用法:QSet 中的算法与功能(Advanced Usage: Algorithms and Functions in QList…...
Mac Doxygen的使用
Doxygen的使用 安装着Doxygen和Graphviz这两个东西 在源码目录先使用doxygen -g生成一个叫 ‘Doxyfile’ 的Doxygen的配置文件修改配置文件,里面都有介绍各个选项的功能,这里主要修改一下几个: HAVE_DOT YES EXTRACT_ALL YES EXTRACT_PRIVATE YES E…...
FPGA基础代码复用
一、verilog中有关代码复用的语法 1、连接符“{}” {4{1b1}} 或者 {5d6, 5d8} 2、参数(Parameter)型常量定义 parameter 参数名=表达式; 或者 localparam 参数名=表达式; parameter DATA_WIDTH 20; 3、function函数定义 …...
Hbase简介
HBase简介 一、HBase简介 1. HBase简介 (1) apache的顶级项目,hadoop的数据库,分布式、大规模的大数据存储。 HBase是Google的BigTable的开源java版本,建立在hdfs之上的,分布式、列存储、非关系(nosql、key-value&a…...
科海思除COD树脂,大孔树脂,除COD专用树脂
一、产品介绍 Tulsimer A-722 MP具有控制孔径的大孔强碱性Ⅰ型阴离子交换树脂 Tulsimer A-722 MP 是一款具有便于颜色和有机物去除的控制孔径的,专门开发的大孔强碱性Ⅰ型阴离子交换树脂。 Tulsimer A-722 MP(氯型)专门应用于去除COD…...
Qt 多线程 QThread、QThreadPool使用场景
QThread 和 QRunnable 都是 Qt 框架中用于多线程编程的类,它们之间有以下不同点: 继承关系不同 QThread 继承自 QObject 类,而 QRunnable 没有父类。 实现方式不同 QThread 是一个完整的线程实现,包含了线程的创建、启动、停止、…...
如何一招搞定PCB阻焊过孔问题?
PCB阻焊油墨根据固化方式,阻焊油墨有感光显影型的油墨,有热固化的热固油墨,还有UV光固化的UV油墨。而根据板材分类,又有PCB硬板阻焊油墨,FPC软板阻焊油墨,还有铝基板阻焊油墨,铝基板油墨也可以用…...
【代码随想录】刷题Day2
1.左右指针比大小 977. 有序数组的平方 class Solution { public:vector<int> sortedSquares(vector<int>& nums) {vector<int> ret nums;int left 0;int right nums.size()-1;int end nums.size();while(left<right){if(abs(nums[left])>abs…...
Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用
Python是功能强大、免费、开源,实现面向对象的编程语言,在数据处理、科学计算、数学建模、数据挖掘和数据可视化方面具备优异的性能,这些优势使得Python在气象、海洋、地理、气候、水文和生态等地学领域的科研和工程项目中得到广泛应用。可以…...
计及调度经济性的光热电站储热容量配置方法【IEEE30节点】(Matlab代码实现)
💥 💥 💞 💞 欢迎来到本博客 ❤️ ❤️ 💥 💥 🏆 博主优势: 🌞 🌞 🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 …...
“不要放过这个春天”解锁品牌春日宣传新玩法
在万物复苏的春天,人们换新装、踏青等需求蓄势待发,出现了全民消费热情高涨的趋势,让品牌「贩卖春天」的宣传此起彼伏。 品牌洞察到用户的消费需求,打造具有品牌特色的浪漫宣传,如采用春日限定元素、创新春天宣传场景…...
利用GPT2 预测 福彩3d预测
使用GPT2预测福彩3D项目 个人总结彩票数据是随机的,可以预测到1-2个数字,但是有一两位总是随机的 该项目紧做模型学习用,通过该项目熟练模型训练调用生成过程. 福彩3D数据下载 https://www.17500.cn/getData/3d.TXT data数据格式 处理后数据格式 每行 2023 03 08 9 7 3 训…...
类加载过程
基本说明 反射机制是Java实现动态语言的关键,也就是通过反射实现类动态加载。 静态加载:编译时加载相关的类,如果没有则报错,依赖性太强动态加载:运行时加载需要的类,如果运行时不用该类,即使…...
【C/C++】C++11 无序关联容器的诞生背景
文章目录 背景无序关联容器适用场景有序关联容器适用场景 背景 C11 引入了无序关联容器(unordered_map、unordered_set、unordered_multimap 和 unordered_multiset)是为了提供一种高效的元素存储和查找方式。相比于有序关联容器(map、set、…...
h264编码原理
在介绍编码器原理之前首先了解三个制定编码标准的组织: 1.国际电信联盟(ITU-T),这是一个音视频领域非常强的组织,规定了很多标准如h261,h262,h263,h263。h263也就是h264的前身。 2.国际标准化组织(ISO)&…...
网络工程师经常搞混的路由策略和策略路由,两者到底有啥区别?
当涉及到网络路由时,两个术语经常被混淆:策略路由和路由策略。虽然这些术语听起来很相似,但它们实际上有着不同的含义和用途。在本文中,我们将详细介绍这两个术语的区别和应用。 一、路由策略 路由策略是指一组规则,用…...
高精度气象模拟软件WRF实践技术
【原文链接】:高精度气象模拟软件WRF(Weather Research Forecasting)实践技术及案例应用https://mp.weixin.qq.com/s?__bizMzU5NTkyMzcxNw&mid2247538149&idx3&sn3890c3b29f34bcb07678a9dd4b9947b2&chksmfe68938fc91f1a99bbced2113b09cad822711e7f…...
总结827
学习目标: 4月(复习完高数18讲内容,背诵21篇短文,熟词僻义300词基础词) 学习内容: 高等数学:刷1800,做了26道计算题,记录两道错题,搞懂了,但并不…...
如何快速掌握LiteDB.Studio:面向初学者的LiteDB数据库终极GUI管理工具完整指南
如何快速掌握LiteDB.Studio:面向初学者的LiteDB数据库终极GUI管理工具完整指南 【免费下载链接】LiteDB.Studio A GUI tool for viewing and editing documents for LiteDB v5 项目地址: https://gitcode.com/gh_mirrors/li/LiteDB.Studio 在嵌入式数据库应用…...
高途CFO沈楠辞职 高级副总裁罗斌晋升为首席运营官
雷递网 乐天 5月15日高途(NYSE: GOTU)日前宣布管理层调整。高途称,公司CFO沈楠由于个人原因已递交辞呈,2026年5月31日生效。沈楠辞职后三个月内继续担任公司顾问,以确保平稳过渡。高途战略主管徐步青将负责公司资本市场相关事宜,高…...
2026届最火的十大降AI率神器解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 人工智能生成内容也就是 AIGC 技术迅猛发展着,其在学术领域的应用引发着深刻变革…...
MAA助手:解放双手的明日方舟全自动游戏管理工具实战指南
MAA助手:解放双手的明日方舟全自动游戏管理工具实战指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://g…...
Midjourney铂金印相风格实战手册(从Prompt工程到Lightroom精修全流程)
更多请点击: https://intelliparadigm.com 第一章:铂金印相风格的美学溯源与数字复现逻辑 铂金印相(Platinum Print)诞生于19世纪晚期,以铂族金属盐在纸基上直接成像,呈现无光泽、宽广影调与近乎永久的化学…...
从分辨率、码率到蓝光:解码高清视频的三大核心要素
1. 分辨率:高清世界的基石 第一次接触高清视频时,我被商家宣传的"4K超清"搞得一头雾水。直到自己开始做视频剪辑才明白,分辨率就像织布的经纬线——它决定了画面能有多细腻。举个生活中的例子,1080P分辨率相当于用19201…...
MoviePilot连接TMDB异常的终极诊断指南:5步快速排查与完整解决方案
MoviePilot连接TMDB异常的终极诊断指南:5步快速排查与完整解决方案 【免费下载链接】MoviePilot NAS媒体库自动化管理工具 项目地址: https://gitcode.com/gh_mirrors/mo/MoviePilot MoviePilot作为NAS媒体库自动化管理工具,其核心功能依赖TheMov…...
Wwise与Godot音频集成:专业游戏音频中间件在开源引擎中的实现
1. 项目概述:连接两大巨头的桥梁如果你是一位游戏音频设计师,或者是一位对游戏音频实现有追求的开发者,那么“Wwise”和“Godot”这两个名字对你来说一定不陌生。Wwise是业界顶级的交互式音频中间件,以其强大的音频逻辑编排、动态…...
Git合并翻车现场实录:从命令行到IDEA,详解Merge冲突前后的撤销操作差异
Git合并操作全流程避险指南:冲突诊断与精准撤销策略 当两个开发分支在版本控制系统中交汇时,合并操作就像一场精心编排的代码芭蕾。但现实往往比理想骨感——据统计,约35%的Git用户在合并过程中至少遭遇过一次需要撤销操作的场景。本文将带您…...
tabtoy性能优化秘籍:多核并发导出与缓存加速技巧
tabtoy性能优化秘籍:多核并发导出与缓存加速技巧 【免费下载链接】tabtoy 高性能表格数据导出器 项目地址: https://gitcode.com/gh_mirrors/ta/tabtoy 在处理大量表格数据导出时,性能往往是开发者面临的主要挑战。tabtoy作为一款高性能表格数据导…...
