什么是悲观锁和乐观锁

乐观锁,顾名思义就是总是假设较好的情况,每次获取数据的时候都认为别人不会修改,所以不会上 锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据。悲观锁,顾名思义就是总是假设最坏的情况,每次获取数据的时候都认为别人会修改,所以每次在获取数据的时候都会上锁。

什么是悲观锁和乐观锁

一、什么是乐观锁

乐观锁,顾名思义就是总是假设较好的情况,每次获取数据的时候都认为别人不会修改,所以不会上 锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和 CAS 算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于 write_condition 机制,其实都是提供的乐观锁。在 Java 中 java.util.concurrent.atomic 包下面的原子变量类就是使用了乐观锁的一种实现方式 CAS 实现的。

二、什么是悲观锁

悲观锁,顾名思义就是总是假设最坏的情况,每次获取数据的时候都认为别人会修改,所以每次在获取数据的时候都会上锁,这样别人想获取这个数据就会阻塞直到它拿到锁后才可以获取(共享资源每次只给一个线程使用,其它线程阻塞,当前线程用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁、表锁、读锁、写锁等,都是在做操作之前先上锁。Java 中 synchronized 和 ReentrantLock 等独占锁就是悲观锁思想的实现。

三、两种锁的使用场景

从上面对两种锁的介绍,我们知道两种锁各有优缺点,我们不可以简单的认为它们哪一种更好 ,像乐观锁适用于写比较少的情况下(多读场景),即实际冲突很少发生的 时候,这样可以省去加锁造成的开销,加大了系统的整个吞吐量。但如果是在多写的情况,一般会经常产生冲突,这就会导致上层应用会不断的进行重试,这样反倒是降低了性能,所以一般在多写的场景下使用悲观锁就比较合适。

延伸阅读

乐观锁的缺点

(1)ABA 问题
ABA 问题是乐观锁的一个常见问题。如果一个变量 V 初次读取的时候是 A 值,并且在准备赋值的时候检查到它仍然是 A 值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回 A,那 CAS 操作就会误认为它从来没有被修改过。这个问题被称为 CAS 操作的 “ABA” 问题。

JDK 1.5 以后的 AtomicStampedReference 类就提供了解决 ABA 问题的方法,其中的 compareAndSet 方法就是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。

(2)循环时间长开销大
自旋 CAS (也就是更新不成功就一直循环执行直到成功)如果长时间不成功,会给CPU 带来非常大的执行开销。 如果 JVM 能支持处理器提供的 pause 指令那么效率会有一定的提升,pause 指令有两个作用,名列前茅它可以延迟流水线执行指令(de-pipeline ), 使 CPU 不会消耗过多的执行资源,延迟的时间取决于具体实现的版本,在一些处理器上延迟时间是零。第二它可以避免在退出循环的时候因内存顺序冲突(memory order violation )而引起 CPU 流水线被清空(CPU pipeline flush ),从而提高 CPU 的执行效率。

(3) 只能保证一个共享变量的原子操作
CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时 CAS 无效。但是从 JDK 1.5 开始,提供了 AtomicReference 类 来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行 CAS 操作。 所以我们可以使用锁或者利用 AtomicReference 类 把多个共享变量合并成一个共享变量来操作。

文章标题:什么是悲观锁和乐观锁,发布者:E.Z,转载请注明出处:https://worktile.com/kb/p/62029

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
E.ZE.Z站长
上一篇 2023年7月27日 下午9:16
下一篇 2023年7月27日

相关推荐

  • 云原生应用的可用性和可靠性如何保障

    云原生应用的可用性和可靠性保障是保证服务不间断、响应迅速、用户体验良好的关键。确保应用表现的关键因素可以分为 1、多样的负载均衡策略、2、自动化的弹性伸缩、3、深入的监控和日志分析、4、全面的故障恢复规划 以及 5、持续的安全性强化。通过这些措施,可以应对高并发情况,迅速响应故障,及时调整资源分配以…

    2023年11月23日
    600
  • 软件测试种类有哪些

    软件测试种类有:1、按照测试阶段分类;2、按照测试技术分类;3、按照软件质量特性分类;4、按照自动化程度分类;5、按照测试类型分类;6、其他分类。其中,按照测试阶段可以将软件测试分为单元测试、集成测试、系统测试与验收测试。 一、按照测试阶段分类 按照测试阶段可以将软件测试分为单元测试、集成测试、系统…

    2023年1月5日
    32200
  • 空洞卷积(dilated convolution)是什么

    在深度学习中,尤其是图像处理和语音处理领域,不同种类的卷积技术扮演着至关重要的角色。空洞卷积,也被称为dilated convolution,是其中的一种。需要考虑以下几个方面:1、基本定义;2、操作方式;3、应用场景;4、与普通卷积的比较;5、优势与局限;6、主要应用。 1、基本定义 空洞卷积:通…

    2023年7月23日
    17200
  • linux编排工具有哪些

    linux编排工具有:1、docker-compose;2、Kubernetes;3、OpenShift;4、Docker Swarm;5、Docker machine;6、Mesos。docker-compose更适合单机编排,只能面向一个docker主机进行编排。 1、docker-compos…

    2023年1月5日
    15400
  • 编程中的LB、LW具体是什么意思

    在编程中,LB和LW是常用的数据类型,它们分别代表着字节和字(Word)。 LB的含义 LB即Low Byte(低字节),是指数据的低8位,也就是数据的最后8位二进制位。在计算机系统中,数据存储是以字节为单位进行的,每个字节包含8位二进制位,因此一个数据可以被分成多个字节进行存储。LB的作用就是表示…

    2023年3月2日
    1.2K00
  • flash动画课件制作软件有哪些特点

    flash动画课件制作软件有哪些特点:1、原画绘制;2、高清矢量图;3、体积小;4、高兼容和互动性。因为Flash动画课件的制作软件非常灵活,使得原画的绘制和方便,所以它具有很强的原画特性。 一、原画绘制 因为Flash动画课件的制作软件非常灵活,使得原画的绘制和方便,所以它具有很强的原画特性。Fl…

    2023年5月12日
    8200
  • 什么软件能自动生成工作计划表

    能自动生成工作计划表的软件有:一、滴答清单;二、时间规划局;三、奇妙日程;四、我要做计划。滴答清单能够随时协助我们制订工作日程、日程安排等,同时将打卡、备忘录、笔记等多种功能整合在一起,方便您的日常事务,提高工作效率。 一、滴答清单 能够随时协助我们制订工作日程、日程安排等,同时将打卡、备忘录、笔记…

    2023年4月24日
    26200
  • 质量管理究竟是做什么的

    质量管理是指在质量方面指挥和控制组织的协调的活动。 质量管理,通常包括制定质量方针和质量目标以及质量策划、质量控制、质量保证和质量改进。不同的公司,担任此职务的人工作有所不同。质量管理是“在质量方面指挥和控制组织的协调的活动”。 一、质量管理的定义 质量管理是指在质量方面指挥和控制组织的协调的活动。…

    2023年1月1日
    1.8K00
  • 缺陷管理的内容是什么

    缺陷管理/软件缺陷管理(Defect Management)是在软件生命周期中识别、管理、沟通任何缺陷的过程(从缺陷的识别到缺陷的解决关闭),确保缺陷被跟踪管理而不丢失。一般的,需要跟踪管理工具来帮助进行缺陷全流程管理。 世间万物都有着自己的生命历程,任何产品在生产过程中,从一开始创建它的过程中,产…

    2022年11月14日
    35100
  • 桌面端屏幕分享实践

    本篇主要介绍 Windows 端和 macOS 端上屏幕分享的实现方式与注意事项。这两套系统都是闭源的,主要信息来源于官方文档,以及加上各位技术前辈和个人的一些摸索,如有不当或者错误的地方,还请诸位不吝指正。 作者:刘国元 网易资深开发工程师 一、前言 实时音视频通信的整个流程,可以大致分为数据采集…

    2022年3月17日
    1.8K10

发表回复

登录后才能评论
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部