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

悲观锁、乐观锁和自旋锁

文章目录

      • 悲观锁
      • 乐观锁
      • 区别
      • 自旋锁
    • 参考

悲观锁

悲观锁 Pessimistic Lock:假定拿到的数据别人都会去修改,因此每次拿数据的时候都会上锁。

乐观锁

乐观锁 Optimistic Lock:假定拿到的数据别人都不会去修改,但在更新的时候会去判断这个数据有没有被修改过,可以使用版本号等机制,Java 使用 CAS。

乐观锁的缺点

  • ABA 问题
          CAS 会导致 “ABA 问题”。CAS 算法实现的一个重要前提是需要取出内存中某时刻的数据,而在下一时刻比较并替换,那么在这个时间差会导致数据的变化。
       比如说一个线程 one 从内存位置 V 中取出 A,这时候另一个线程 two 也从内存中取出 A,并且 two 进行了一些操作变成了 B,然后 two 又将 V 位置的数据变成 A,这时候 one 进行 CAS 操作发现内存中任然是 A,然后 one 操作成功。尽管线程 one 的 CAS 操作成功,但是这并不代表这个过程就是没有问题的。
          部分乐观锁的实现是通过版本号(version)的方式来解决 ABA 问题,乐观锁每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行 +1 操作,否则就执行失败,因为每次操作的版本号都会随着增加,所有不会出现 ABA 的问题。
  • 只能保证一个共享变量的原子操作
          CAS 只对单个变量有效,但涉及到多个共享变量时 CAS 无效。

区别

两种锁各有优缺点
悲观锁适用于多写的情况,而乐观锁则不适用,因为在多写的情况下,乐观锁可能会有多次 retry 的情况 ,这样反倒降低性能。

自旋锁

自旋锁 Spin Lock 一个线程在获取锁的时候,如果锁被其他线程占用的话,它会一直等待直到获得锁。

自旋锁在获取不到锁的时候不会进入阻塞状态,从而进入阻塞态,也就是说它会一直处于用户态,这样也就减少了上下文切换的开销

参考

乐观锁和悲观锁的区别(最全面的分析)

相关文章:

  • RTL8720CM WI-FI+蓝牙,低功耗IoT(物联网)应用 40QFN
  • 程序设计竞赛-过了这个村没这个店
  • C语言实现基于高效率IP路由查找的内容
  • 南大通用GBase8s 常用SQL语句(263)
  • Bootstrap Table 实现 分页选中
  • 嵌入式系统开发笔记89:认识AVR微控制器系统架构
  • GeoPandas安装
  • View-of-Delft数据集文件学习
  • 西门子PLC S7-1200如何实现远程上下载?
  • MySQL的SQL基础(五)
  • 图书巨头BakerTaylor遭勒索软件攻击 系统中断一周仍未恢复
  • 项目实战第三十六讲:基于 Sharding-JDBC 的商品分库⽅案
  • MySQL(进阶篇--InnoDB引擎)
  • 【Linux修炼】开篇
  • 【数学建模】层次分析(MatlabPython代码实现)
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • Apache Spark Streaming 使用实例
  • axios 和 cookie 的那些事
  • E-HPC支持多队列管理和自动伸缩
  • Golang-长连接-状态推送
  • java8 Stream Pipelines 浅析
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL数据库运维之数据恢复
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • oschina
  • Python利用正则抓取网页内容保存到本地
  • Selenium实战教程系列(二)---元素定位
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • vue-router的history模式发布配置
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 什么软件可以剪辑音乐?
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 用jquery写贪吃蛇
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​linux启动进程的方式
  • !!Dom4j 学习笔记
  • (2)leetcode 234.回文链表 141.环形链表
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (排序详解之 堆排序)
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)Linux下编译安装log4cxx
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • ***原理与防范
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [ Socket学习 ] 第一章:网络基础知识