什么是悲观锁和乐观锁

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

什么是悲观锁和乐观锁

一、什么是乐观锁

乐观锁,顾名思义就是总是假设较好的情况,每次获取数据的时候都认为别人不会修改,所以不会上 锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和 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日 下午9:27

相关推荐

  • 敏捷开发要学什么工具

    敏捷开发要学的工具有:一、Jira;二、Trello;三、Asana;四、Slack;五、Microsoft Teams;六、Git;七、SVN。Jira 是一款由 Atlassian 公司开发的项目管理工具。它支持敏捷开发和其他项目管理方法,可以帮助团队跟踪任务、计划和报告工作进展。 一、Jira…

    2023年4月16日
    28600
  • 编程初赛考什么

    在编程初赛中,最常考察的内容可以总结为1、基础语法知识、2、数据结构与算法、3、逻辑思维与解题技巧。 特别地,数据结构与算法部分是重中之重。这个领域覆盖了如数组、链表、栈、队列、树、图等基本数据结构,以及排序、搜索、动态规划、贪心算法、回溯算法等核心算法。掌握这部分内容不仅能帮助参赛者在初赛中取得好…

    2024年5月2日
    700
  • 编程要在电脑上下载什么

    电脑上编程需要下载的主要软件包括1、代码编辑器或集成开发环境(IDE)、2、编译器或解释器、3、版本控制系统、4、数据库系统以及5、辅助工具和库。 代码编辑器或集成开发环境(IDE)是编程的核心工具。它们提供了一个用于编写和测试代码的界面。从简单的文本编辑器如Sublime Text或Notepad…

    2024年4月27日
    2400
  • 中建项目经理如何管理成本

    中建项目经理如何管理成本的核心策略包括明确成本目标设置、精准预算编制、成本控制及监督、风险管理和价值工程的应用。在这些策略中,精准预算编制是管理成本的基石,它要求项目经理基于项目实际需求和市场行情,合理估算项目所需的全部成本,包括但不限于材料、人工、设备和管理费用等。通过精准的预算编制,可以为项目成…

    2024年4月11日
    7400
  • 网络编程应该看什么书

    网络编程的学习涉及概念理解、协议熟悉与代码实践,在选择书籍时,可以关注以下几点:1、经典教材与参考书目;2、实践指导书籍;3、协议相关标准与详解;4、安全编程;5、具体编程语言下的网络编程指南。 具体来说,例如在经典教材中,《Unix网络编程》系列深入讲解了套接字(Socket)编程及网络程序设计的…

    2024年4月27日
    3200
  • 你们是用什么语言讲编程的

    标题:解析当前编程语言的多样化使用环境 1、多种编程语言并存,各有特色与应用领域;在众多编程语言中,Python因其简洁的语法和强大的第三方库支持,在数据科学、人工智能、网络开发等领域占据了重要地位。Python提供了简单易学的语法,使得初学者能够快速入门,同时,它的动态性和解释性让复杂项目的原型开…

    2024年4月27日
    3100
  • 不同编程语言代表什么

    不同编程语言代表着独特的应用领域、设计理念与发展趋势。以Python为例,它代表着易学性、多用途及极大的社区支持。Python的设计哲学强调代码的可读性与简洁性,这使得它成为初学者的首选。同时,它广泛应用于网站开发、数据分析、人工智能等多个领域,展现了其多用途的特性。Python社区的活跃也为用户提…

    2024年4月27日
    3100
  • 学什么编程快

    在选择学习编程语言的过程中,三个核心要素值得考量:1、易于学习的语法结构;2、广泛的应用场景;3、充足的学习资源和社区支持。 对于初学者来说,易于学习的语法结构尤其重要,它能够让学习者快速理解和掌握编程的基础,进而激发学习的兴趣。例如,Python因其简洁的语法、清晰的语言结构而成为许多初学者的首选…

    2024年5月2日
    1200
  • 编程都学什么

    编程都学什么 学习编程包括1、编程语言基础、2、算法和数据结构、3、软件开发原则、4、数据库知识、5、计算机网络基础、6、操作系统原理。其中,算法和数据结构是编程的心脏,它不仅是评估编程能力的标准,也是有效解决问题与优化程序性能的关键。 算法是一系列解决问题的明确指令,数据结构是算法操作的对象。学习…

    2024年4月25日
    3600
  • arm用什么软件编程

    摘要 ARM架构使用多种软件进行编程,其中包括1、集成开发环境 (IDEs),2、命令行工具链,3、调试工具。具体依赖于开发者的需求和所处的开发环境。集成开发环境如Keil MDK-ARM、IAR Embedded Workbench和Eclipse with ARM plugins,以其功能全面和…

    2024年4月26日
    4200

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

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

分享本页
返回顶部