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

乐观锁悲观锁

乐观锁

乐观锁的核心思想是“尽量不去锁定资源,而是尽量让线程并发地工作”,并在最后阶段检查冲突,只有在检测到冲突时才会采取纠正措施。乐观锁通常通过以下方式实现:

  • 版本号控制:每次对共享资源进行修改时,都会更新一个版本号。线程在读取资源时会记录版本号,修改时会检查版本号是否变化。如果没有变化,修改成功;否则,重试。
  • CAS(Compare-And-Swap):这是乐观锁的一种常见实现。CAS操作原子地比较变量的当前值和期望值,如果相等则更新为新值,否则重试。

应用场景

  1. 读操作远多于写操作的场景:在这种情况下,冲突的概率较小,乐观锁可以减少锁的开销,提高系统的并发性能。
  2. 性能要求高:乐观锁因为不需要频繁的加锁和解锁,通常比悲观锁的性能更好。
  3. 短时间内的冲突检测:乐观锁适用于冲突比较少的场景,如果冲突频繁,则可能导致大量的重试,影响性能。

悲观锁

悲观锁的核心思想是“总是认为会发生冲突”,所以在访问共享资源时会对其加锁,以确保其他线程不能同时修改。这种方式确保了线程在操作资源时的互斥性。常见的悲观锁有:

  • 互斥量(Mutex):使用互斥量可以保证在同一时间只有一个线程可以访问某个共享资源。
  • 读写锁(Read-Write Lock):允许多个线程同时读取,但在写入时会锁定,确保写操作的独占性。

应用场景

  1. 写操作频繁的场景:当对共享资源的写操作频繁时,悲观锁可以有效地保护数据一致性。
  2. 冲突概率高的情况:当系统中存在多个线程频繁地争用共享资源时,悲观锁可以避免冲突带来的问题。
  3. 需要强一致性:在一些要求数据强一致性的场景中,悲观锁可以确保数据的一致性,尽管会牺牲一些性能。
http://www.lryc.cn/news/434468.html

相关文章:

  • Unity面试:什么是UnityEvent?
  • 食品安全管理员考试真题题库及答案
  • 【C++】—— vector 的模拟实现
  • MySQL 查询过慢的优化方法
  • YoloV8修改分类(Classify)的前处理(记录)
  • 半监督学习能否帮助训练更好的模型?
  • VBA 获取字段标题代码轻松搞定
  • C++代码片段
  • Golang | Leetcode Golang题解之第388题文件的最长绝对路径
  • docker打包前端项目
  • 调度器怎么自己写?调度器在实现时需要注意哪些细节?请写一个jvm的调度器?如何在这个调度器中添加多个任务?
  • 创客匠人对话|德国临床营养学家单场发售百万秘笈大公开
  • 开源项目低代码表单FormCreate从Vue2到Vue3升级指南
  • 序偶解释:李冬梅老师书线性表一章第一页
  • 3GPP协议入门——物理层基础(二)
  • Java学习Day41:手刃青背龙!(spring框架之事务)
  • el-image(vue 总)
  • 餐饮「收尸人」,血亏奶茶店……
  • 【Python进阶】学习Python从入门到进阶,详细步骤,就看这一篇。文末附带项目演练!!!
  • OpenCV结构分析与形状描述符(9)检测轮廓相对于其凸包的凹陷缺陷函数convexityDefects()的使用
  • HTTP 之 响应头信息(二十三)
  • 智能风扇的全新升级:NRK3603语音芯片识别控制模块的应用
  • 如何通过pSLC技术实现性能与容量的双赢
  • 减速电机的基本结构及用料简介
  • 1688跨境电商接口开放接入,跨境电商的尽头到底谁在赚钱?
  • SpringBoot 增量部署发布
  • java八股!1
  • 【学术会议征稿】2024年智能驾驶与智慧交通国际学术会议(IDST 2024)
  • 2024最全网络安全工程师面试题(附答案)
  • 828华为云征文| 华为云 Flexus X 实例:引领云计算新时代的柔性算力先锋