高频面试八股文用法篇(四) 乐观锁和悲观锁的例子

news2024/12/23 16:26:54

目录

什么是乐观锁和悲观锁 

乐观锁的实现方式主要有两种:CAS机制和版本号机制

1)CAS(Compare And Swap)

(2)版本号

乐观锁适用场景

乐观锁和悲观锁优缺点

功能限制

竞争激烈程度


什么是乐观锁和悲观锁 

乐观锁:

顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

  • 乐观锁适用于多读的应用类型,这样可以提高吞吐量
  • 像数据库提供的类似于 write_condition 机制,其实都是提供的乐观锁。
  • 在 Java中 java.util.concurrent.atomic 包下面的原子变量类就是使用了乐观锁的一种实现方式 CAS 实现的。

悲观锁:

总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。

  • 传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等MySQL中的排它锁,都是在做操作之前先上锁。
  • 再比如 Java 里面的同步原语 synchronized 关键字的实现也是悲观锁。

乐观锁的实现方式主要有两种:CAS机制和版本号机制

1)CAS(Compare And Swap)

CAS操作包括了3个操作数:

  1. 需要读写的内存位置(V)
  2. 进行比较的预期值(A)
  3. 拟写入的新值(B)
    CAS操作逻辑如下:

如果内存位置V的值等于预期的A值,则将该位置更新为新值B,否则不进行任何操作。

以Java中的自增操作(i++)为例,看一下悲观锁和CAS分别是如何保证线程安全的。

  • CAS  :使用乐观锁

AtomicInteger是java.util.concurrent.atomic包提供的原子类,利用CPU提供的CAS操作来保证原子性

private static AtomicInteger valueCas= new AtomicInteger(0);

...

valueCas.getAndIncrement();
  • 使用悲观锁
private static int value = 0;

...

private static synchronized void increaseValue() { value++; }

(2)版本号

版本号机制:乐观锁每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行 +1 操作,否则就执行失败

  • 使用版本号

update user set name = 'a' ,version = version +1 where id = 1 and version = 1; 条件中version=1 可以确保没有任何事务更新过记录,否则会更新失败。

  • 版本号的取值: 可以使用时间戳

同样是在需要乐观锁控制的table中增加一个字段,名称无所谓,字段类型使用时间戳(timestamp), 和上面的version类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。

  • 使用悲观锁

悲观锁通过加锁,使用select …… for update进行查询

比如:SELECT * FROM CONTRACT where id = ** FOR UPDATE,这样就会对该行记录加上X锁。 

需要注意的是,SELECT ... FOR UPDATE会对所有扫描过的行加锁,因此在MySql中使用悲观锁要走索引。另外使用SELECT *** FOR UPDATE加上X锁后,仍然可以使用SELECT * from contract where id =...查询出同一行记录。

乐观锁适用场景

比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。

实现方式: 相比于悲观锁,在对数据库进行更新时,乐观锁并不会使用数据库提供的锁机制,而是在业务层进行控制。
 

乐观锁和悲观锁优缺点


乐观锁和悲观锁并没有优劣之分,它们有各自适合的场景;下面从两个方面进行说明。

功能限制

与悲观锁相比,乐观锁适用的场景受到了更多的限制,无论是CAS还是版本号机制。
例如,CAS只能保证单个变量操作的原子性,当涉及到多个变量时,CAS是无能为力的,而synchronized则可以通过对整个代码块加锁来处理。

再比如版本号机制,如果query的时候是针对表1,而update的时候是针对表2,也很难通过简单的版本号来实现乐观锁。

竞争激烈程度

如果悲观锁和乐观锁都可以使用,那么选择就要考虑竞争的激烈程度:
当竞争不激烈 (出现并发冲突的概率小)时,乐观锁更有优势,因为悲观锁会锁住代码块或数据,其他线程无法同时访问,影响并发,而且加锁和释放锁都需要消耗额外的资源。

当竞争激烈(出现并发冲突的概率大)时,悲观锁更有优势,因为乐观锁在执行更新时频繁失败,需要不断重试,浪费CPU资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/615296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

录音软件哪个好用?录音软件免费下载安装

案例:有没有好用的录音软件推荐? 【我想录制电脑上的音乐和音频会议,也想用电脑录制自己的歌声,有没有好用的电脑录音软件推荐?】 在日常生活和工作中,我们经常会遇到需要录音的场景,比如会议…

几行代码,轻松教你用Java 将 Word 文档转换为 HTML

Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。此外, Aspose API支持流行文件格式处…

基于windows环境利用VS下通过Linux环境下服务器进行UDP通信交流

目录 前言 Linux udpServer.cc udpServer.hpp makefile windows 细节1 -- 头文件引入 细节2 -- 固定写法 细节3 -- 结束后清理 细节4 -- socket返回值接受 细节5 -- 套接字创建(一样的写法) 细节6 -- 填写sockaddr_in结构体 细节7 -- 接发收数据 细节8 -- 报错信…

自学黑客(网络安全),一般人我还是劝你算了

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员【以编程为基础的学习】再开始学习 我在之前的回答中,我都一再强调不要以编程为基础再开始学习网络安全,一般来说,学习编程不但学习周期长,而且实际向安全过渡后可…

操作系统复习2.2.4-作业/进程调度算法

算法 FCFS先来先服务、SJF短作业优先、HRRN高响应比优先、时间片轮转、优先级调度、多级反馈队列调度 FCFS先来先服务 公平,按照到达先后顺序进行服务 用于作业时,考虑哪个作业先到达后备队列 用于进程时,考虑哪个进程先到达就绪队列 非抢…

引领科技潮流:国产化操作系统和CPU的市场竞争力

随着国家科技实力的不断提升,国产化已经成为了中国科技发展的一大趋势。在多个领域,中国企业正在加快国产替代进程,取得了一定的成果。 2、国产化现状 2.1、操作系统 中国国产操作系统包括以下几种: 麒麟操作系统(Kylin OS):由…

2023 某行业-CTF

文章目录 miscmisc1misc2misc3misc4 WebWeb1Web2Web3Web5 misc misc1 %26%2365%3B%26%2376%3B%26%2390%3B%26%23107%3B%26%23121%3B%26%2389%3B%26%2377%3B%26%2366%3B%26%2390%3B%26%2351%3B%26%2355%3B%26%23120%3B%26%23102%3B%26%23119%3B%26%2369%3B%26%2371%3B%26%2310…

Python从入门到精通_Day_1_Python的学习路线整理

写在最前: 为什么开这个专栏: 之前我做过一个专栏,专门介绍Python爬虫技术,这一专栏收获了很多朋友们的点赞收藏和关注。但是在爬虫技术专栏中,对于Python语言本身的讲解并不是很细致,由于Python在爬虫、数…

【Unity XCharts - 01】XCharts图表库简介

XCharts 图表库简介 1.概述2.官方资源简介2.1 官网介绍2.2 本体源码资源2.3 Unity .unitypackage 资源包2.4 Demo代码资源 ❤️ 打不开地址、下载慢的话童鞋可以在我的资源中下载 3.6.0 版本相关的资源。❤️ → 开源Unity图表库:XCharts 3.6.0 ← 1.概述 XCharts …

windows物理机如何迁移到VMware集群里简单教程

前言 快速将本地和远程物理机转换为虚拟机,而无需停机。同时转换可实现大规模虚拟化实施。提供对源物理机。 VMware和Microsoft 虚拟机格式以及某些第三方磁盘映像格式的广泛支持。 它可以自动从物理机(运行Windows和Linux)和从其他虚拟机格…

语音转文字怎么转?教你三个转换的方法

录音转文字电脑软件哪个好?分享三款好用的录音转文字工具 一分钟告诉你录音转文字电脑软件哪个好 录音转文字电脑软件哪个好?这几款把语音转成文字的软件推荐给你 如何语音转文字?三款好用语音转文字的软件推荐 语音转文字怎么转&#xf…

智慧社区物业

智慧社区跟物业有什么关系呢? 随着智能化科技的快速发展,智慧社区逐渐成为现代城市的新宠。智慧社区代表着社区信息化和智能化的水平,它的出现彻底改变了传统社区的管理形式。而在智慧社区中,物业管理是其中最为重要的环节之一&a…

【软件技术基础】C#调用NPOI插件对EXCEL进行处理

文章目录 前言一、处理界面二、按钮处理代码0、公共变量1、btnSelectFolder_Click中的代码2、btnOneKey_Click中的代码3、btnImport_Click中的代码4、btnCheck_Click中的代码5、btnProces_Click中的代码6、btnExpert_Click中的代码 三、公共部分函数总结 前言 NPOI插件进行EXC…

如何通过知识星球粉丝变现年入100万?

使用知识星球年入100万的话,那么你的社群收费必须超过125万,因为星球会有20%的手续费。 年入100万并不是一笔小数目,如果要达成这个目标,按照每个人付费100元计算,那么需要1万个付费用户,平均每个月就需要9…

Spark RDD持久化机制

文章目录 一、RDD持久化(一)引入持久化的必要性(二)案例演示持久化操作1、RDD的依赖关系图2、不采用持久化操作3、采用持久化操作 二、存储级别(一)持久化方法的参数(二)Spark RDD存…

最优化理论-KKT定理的推导与实现

目录 一、引言 二、最优化问题的基本概念 三、KKT条件的引入 1. 梯度条件 2. 原始可行性条件 3. 对偶可行性条件 四、KKT定理的表述 五、KKT定理的证明 1. 构造拉格朗日函数 2. 构造拉格朗日对偶函数 3. 推导KKT条件 4. 解释KKT条件 六、KKT定理的应用 七、总结 …

Python数据攻略-Pandas常用数据操作

大家好,我是Mr数据杨。今天我将带领各位走进Python的奇妙世界,就像步入三国演义那样热闹且复杂的战争年代。这里,数据就像那些智勇双全的武将和策士,我们要学习如何访问和修改它们,就如同诸葛亮那样掌控战局。 先来理…

1+X 大数据应用开发(Java)理论题库(中级题4)

文章目录 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 1 <ALL表示小于最小 2 大于ANY表示大于最小值 3 LEFT OUTER JOIN 等同于LEFT JOIN 4 5 6 substr(string string,num start,num length); string为字符串&#x…

1160万美元!美国匹兹堡大学批准贷款建设量子信息核心WPQIC

​ 宾夕法尼亚州西部量子信息中心的首任主任Michael Hatridge教授展示量子信息科学和工程的技术实践&#xff08;图片来源&#xff1a;网络&#xff09; 量子物理学是植根于计算机、网络和传感器的有形世界。为了开创量子技术的新时代&#xff0c;研究人员需要可专用的定制化设…