通过阅读本文可以获得什么

1、什么是乐观锁?
2、乐观锁实现方式都有什么?
3、乐观锁优缺点有哪些?
4、乐观锁适用场景?
5、什么是悲观锁?
6、悲观锁实现方式有哪几种?
7、悲观锁优缺点?
8、悲观锁的适用场景?

首先,我们先看一下什么是乐观锁,在我个人理解,乐观锁可以抽象为去银行取钱,假如银行没有人排队,所以不需要取号,直接去柜台A就可以办理业务。反之悲观锁就是假如去银行取钱,每次去都好巧不巧的都有人在柜台A排队,所以此时需要取号,然后等叫号在去柜台A办理业务。(假设银行只有一个柜台A,不是很形象,只是说明这个问题,乐观锁干啥都是乐观看待,悲观锁都是悲观看待),下面跟我一起看下标准解释是怎么说的,首先看下什么是乐观锁?

乐观锁

  • 乐观锁(Optimistic Locking )相对于悲观锁而言,乐观锁机制采取更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本(version)记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 version字段来实现。读取数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号等于数据库表当前版本号,则予以更新,否则认为是过期数据。

读完上面这一段,我们应该已经知道乐观锁的意思了,也就是说大部分乐观锁其实就是加了版本号version字段,根据这个字段实现的乐观锁机制,那么还有什么方式可以实现乐观锁呢,聪明的你肯定已经想到了CAS,对的,CAS(compare and swap)比较并修改,CAS需要三个参数,内存地址V,旧的预期值A和新值B,只有当V的值等于A时,才会将V的值改为B。

好了,目前乐观锁的实现方式上我们知道了有版本号机制和CAS机制,那么这两种机制会带来什么问题呢?下面跟我一起来看看

首先就是CAS会有ABA问题的出现,什么是ABA问题呢,ABA问题就是张三放桌子100块钱,中间李四拿100块钱用了,用完之后又放了100块到桌子上,等张三回来,发现还是100块,就以为还是他的100块,其实,这个100块钱已经发生了变化,这就是经典的ABA问题。这种问题怎么解决了,也就是上面我们所说的版本号机制,加入版本号(版本号必须是顺序递增的)之后,判断版本,只有当版本号相同时才更改值,然后版本号+1;在更新值的时候如果发现版本号不匹配也就不再进行更改了,这样就可以避免ABA问题了

但是CAS自旋会一直尝试获取锁,如果一直获取不到锁的情况下,此时CPU就会爆表,带来非常大的开销。所以综上所述,乐观锁比较适合读多写少的场景,这样冲突就真的很少发生,也就降低了加锁的成本;但是如果经常产生冲突,应用不断的尝试加锁,反而会影响系统性能,此时就不如使用悲观锁了

悲观锁

悲观锁是什么呢,其实看完上面的乐观锁,对悲观锁的概念自己内心应该也有了一定的概念,是的,你想的没错,悲观锁就是很悲观,不管做啥,都假设是冲突的场景,拿我们上面去银行取钱的例子来说的话就是每次去取钱都有大量的人在柜台A取钱,都在排队等待,等轮到我取钱的时候,相应的其他人也都要等待。对应的我们的场景也就是不管谁来获取资源,都要先拿到锁,这也就是通俗点讲悲观锁的概念了,下面还是按照惯例看下正统说法:

  • 悲观锁,正如其名,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

那么,既然如此的话悲观锁又都有什么优缺点呢,首先优点就是,保证多线程下顺序读写,防止脏数据产生,缺点就是并发场景下性能显著下降。

所以与乐观锁相对应的悲观锁的适用场景就是读少写多 的场景,这种场景下,冲突多,所以悲观锁很适合。目前我了解的悲观锁实现方式有Lock和Synchronized,其次就是MySQL的for update语句,MySQL中查询语句,select ...... for update 此时就是对数据加了排它锁,排它锁也是一种悲观锁。所以我们对该数据的访问会对该数据进行加锁,后面来的对该数据的操作都会排队等侯,直到拿到锁

除了MySql中查询语句使用的悲观锁,工作中还有好多地方用到了乐观锁悲观锁,比如说,java.util.concurrent.Atomic下的原子变量是使用CAS机制,Elasticsearch是使用了version的乐观锁机制

总结

乐观锁的实现方式有Version(顺序递增)版本号机制和CAS机制。悲观锁的实现方式有Synchronized和Lock,数据库有for update 拍它锁。适用场景就是,乐观锁适合读多写少的场景,悲观锁适合读少写多的场景

好了本篇文章到这就结束了,简单概述下乐观锁与悲观锁的概念,如果描述不对的欢迎指正,一起进步

[原文链接](一篇文章带你了解乐观锁与悲观锁的适用场景)

一文彻底理解乐观锁与悲观锁相关推荐

  1. [初级]深入理解乐观锁与悲观锁

    2019独角兽企业重金招聘Python工程师标准>>> 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔 ...

  2. 深入理解乐观锁与悲观锁

    在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲 ...

  3. mysql乐观锁与事务_[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

    注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库 ...

  4. 深入理解乐观锁与悲观锁(实战)

    在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲 ...

  5. 乐观锁和悲观锁的简单理解

    乐观锁和悲观锁的简单理解 一.悲观锁 每次读取数据时认为其他线程会修改这个数据,所以每次读的时候都会加锁,实现悲观锁需要使用数据库的锁机制 1.共享锁 2.排他锁 3.行锁 ① 共享锁 共享锁也称为S ...

  6. 浅谈对于乐观锁和悲观锁的理解

    今儿回忆了一下关于乐观锁和悲观锁的知识,要唠唠这两个点,那先得知道什么是锁? 1.锁的定义:锁是一种互斥的机制,在多线程环境中实现对资源的协调与控制,凡是有资源被多线程共享,涉及到修改的情况就要考虑锁 ...

  7. 数据库---通俗理解乐观锁和悲观锁

    mysql数据库和java中有关乐观锁和悲观锁的概念以及实现方式 在数据库的锁机制中,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时在存储数据库中同一数据时不破坏事物的隔离性和统一性 ...

  8. 乐观锁与悲观锁深入学习理解

    乐观锁与悲观锁深入学习理解 一.乐观锁和悲观锁 悲观锁 乐观锁 二.两种锁的使用场景 悲观锁 乐观锁 三.乐观锁实现方式 四.乐观锁的缺点 五.总结 参考文献 一.乐观锁和悲观锁 乐观锁和悲观锁并不是 ...

  9. 一文搞懂 mysql 中的共享锁、排他锁、悲观锁、乐观锁及使用场景

    目录 一.常见锁类型 二.Mysql引擎介绍 三.常用引擎间的区别 四.共享锁与排他锁 五.排他锁的实际应用 六.共享锁的实际应用 七.死锁的发生 八.另一种发生死锁的情景 九.死锁的解决方式 十.意 ...

最新文章

  1. ResNets王者回归!谷歌、伯克利联合发文:它当初输给EfficientNets不是架构问题...
  2. 软工第二次练习——团队展示
  3. rxjs fromEvent的用法
  4. directly test Gateway frontend service in AG3 SICF
  5. java综合案例_综合实例 - Java House - BlogJava
  6. web前端之js快速入门(BOM和DOM)
  7. 计算机与计算机视觉史话
  8. Mac实践--MAC搭建FTP服务器
  9. 【转】vue中如何实现数据的双向绑定
  10. Socket TCP Ping使用小结
  11. appfuse_AppFuse 3.0
  12. win7添加打印机失败
  13. 解决问题Uncaught SyntaxError: The requested module ‘/node_modules/hls.js/dist/hls.js‘ does not provide
  14. 联通的G网和C网分别是什么意思?
  15. python如何编写温度转换_Python温度转换实例分析
  16. 谁说大专生不能够学好Java呢?照着这个路线走,高中生都可以!
  17. AMBA总线协议(三)——一文看懂AHB总线所有协议总结(AHB2 AHB-Lite AHB5 )
  18. python列表插入_python列表插入append(), extend(), insert()用法详解
  19. master主节点初始化报错 /proc/sys/net/ipv4/ip_forward contents are not set to 1
  20. Python采集ppt素材模板 (多线程版本),答辩、演讲再也不怕没有好用的PPT模板了(含完整源代码)

热门文章

  1. word不能复制粘贴,提示激活宏
  2. JavaScript中的二进制搜索算法
  3. 图片大小自适应垂直居中的方法
  4. select2切换事件如何生效
  5. 2020上半年总结:逆势上行与困顿迷茫
  6. OneNote for windows10卸载及重装
  7. t型三电平matlab仿真,T型三电平逆变器在不间断电源中的实现
  8. 『前端面试题纪实』2020/春+秋 实习
  9. 计算机高级文秘学什么的,文秘专业主要学什么|文秘专业的职业目标是什么
  10. 采用STM32外部中断模式控制LED灯亮灭