【锁】各种锁的概念

解释一下什么是乐观锁、悲观锁、自旋锁、互斥锁、读写锁、排他锁、共享锁、统一锁、分段锁?

定义角度不同,通常把(乐观锁、悲观锁)、(自旋锁、互斥锁)、(读写锁、排他锁、共享锁)、(统一锁、分段锁)分组理解

1. 乐观锁(Optimistic Locking)

  • 定义:乐观锁机制采取了更加宽松的加锁机制,认为数据的变动不会太频繁。它通常基于数据版本(Version)记录机制实现,通过为数据增加一个版本标识来避免冲突。
  • 应用场景:适合读多写少的场景,能够提升系统整体性能,避免长事务中的数据库加锁开销。
  • 优点:提高了系统的并发性,减少了锁的开销。
  • 缺点:如果数据更新频繁,可能会导致大量数据冲突,增加重试成本。
  • 实现方式:在数据库表中增加一个“version”字段,每次更新数据时,将版本号加一,并检查当前版本号是否与提交时的版本号一致。

2. 悲观锁(Pessimistic Locking)

  • 定义:悲观锁认为被保护的数据是极其不安全的,每个时刻都有可能被其他进程修改。因此,它会先对数据进行加锁,然后才能进行操作。
  • 应用场景:适合写操作较多的场景,能够确保数据的一致性和完整性。
  • 优点:能够有效地防止数据冲突,保证数据的准确性。
    -缺点:可能会降低系统的并发性,因为当一个事务持有锁时,其他事务只能等待。
  • 实现方式:数据库中的行锁、表锁、读锁、写锁以及synchronized关键字实现的锁都可以视为悲观锁的一种形式。

3. 自旋锁(Spin Lock)

  • 定义:自旋锁是专为防止多处理器并发而引入的一种锁,它在内核中大量应用于中断处理等部分。自旋锁在尝试获取锁时,如果锁已被占用,则循环等待直到锁被释放。
  • 应用场景:适合锁持有时间非常短的场景,如中断处理、底半部等。
  • 优点:避免了线程在获取锁时的睡眠和唤醒开销,提高了效率。
  • 缺点:如果锁持有时间过长,会导致CPU资源的浪费,甚至可能引发死锁。
  • 实现方式:通过特定的原子操作(如test-and-set)来实现对锁的获取和释放。

4. 互斥锁(Mutual Exclusion)

  • 定义:互斥锁是一种用于保护共享资源的锁,它可以保证在任意时刻只有一个线程能够访问共享资源,从而避免了多个线程同时对共享资源进行写操作导致的数据不一致问题。其工作原理主要涉及两个关键操作:加锁(Lock)和解锁(Unlock)。

当已经有一个线程加锁后,其他线程加锁则就会失败,互斥锁和自旋锁对于加锁失败后的处理方式是不一样的:

互斥锁加锁失败后,线程会释放 CPU ,给其他线程;
自旋锁加锁失败后,线程会忙等待,直到它拿到锁;

5. 读写锁(Read-Write Lock)

  • 定义:将共享资源的访问者分为读者和写者。读者可以同时访问共享资源,但写者在写入时需要独占访问权。读写锁维护了一对锁,一个读锁和一个写锁,读锁是一个共享锁,写锁是一个排它锁,在读操作时获取读锁,写操作时获取写锁。
  • 应用场景:读写锁适用于能明确区分读操作和写操作的场景
  • 优点:允许多个读者同时访问共享资源,提高了系统的并发性。
  • 缺点:当写者较多时,可能会导致写者之间的冲突和等待。
  • 实现方式:通过维护一个读者计数器和一个写者标志位来实现对读写操作的控制。

6. 排他锁(Exclusive Lock)

  • 定义:排他锁又称为写锁、独占锁,是一种基本的锁类型。它允许事务对数据对象进行读取和修改,同时阻止其他任何事务对同一数据对象进行访问。
  • 应用场景:适合需要独占访问共享资源的场景。
  • 优点:能够确保数据的完整性和一致性。
  • 缺点:降低了系统的并发性。

7. 共享锁(Shared Lock)

  • 定义:共享锁又称为读锁,它允许事务对数据对象进行读取操作,但阻止其他事务对该数据对象进行写操作。
  • 应用场景:适合多个事务需要同时读取同一数据对象的场景
  • 优点:提高了系统的并发性,允许多个事务同时读取同一数据对象。
  • 缺点:在共享锁持有期间,其他事务无法对数据进行写操作。

8. 统一锁(Unified Lock)

  • 定义:统一锁是一种综合了排他锁和共享锁的锁机制,它可以根据需要切换到排他模式或共享模式。(大粒度)
  • 应用场景:适用于需要根据不同情况灵活切换锁模式的场景。
  • 特点:具有排他锁和共享锁的双重特性,能够根据需要进行灵活切换。

9. 分段锁(Segment Lock)

  • 定义:分段锁是一种将数据划分成多个部分,并为每个部分分配一个锁的机制。(小粒度)
  • 应用场景:适用于需要处理大量数据且数据可以分段的场景,如数据库中的分区表。
  • 特点:通过分段锁可以减少锁的竞争,提高系统的并发性能。不同的线程可以同时访问不同的数据段而不会产生冲突。
  • ConcurrentHashMap

总结

互斥锁和自旋锁都是最基本的锁,读写锁可以根据场景来选择这两种锁其中的一个进行实现。

另外,互斥锁、自旋锁、读写锁都属于悲观锁,悲观锁认为并发访问共享资源时,冲突概率可能非常高,所以在访问共享资源前,都需要先加锁。

乐观锁、悲观锁是从锁的心态出发,和业务场景高度相关。

统一锁、分段锁是从锁的粒度出发,全局和局部锁的划分。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言编程与进阶

1.0 C语言关键字 1-1C语言关键字-CSDN博客文章浏览阅读831次,点赞13次,收藏24次。define使用define定义常量return 0;使用define定义宏// define 定义宏,名字是ADD(x,y),x y 是宏的参数int a 10;int b 20;return 0;宏定义的本质是替换&am…

VitePress美化

参考资料: https://blog.csdn.net/weixin_44803753/article/details/130903396 https://blog.csdn.net/qq_30678861/category_12467776.html 站点信息修改 首页部分的修改基本都在.vitepress/config.mts,这个文件内修改。 title 站点名称 description 描述 top…

基于Java技术的篮球论坛系统

你好呀,我是计算机学姐码农小野!如果有相关需求,可以私信联系我。 开发语言 Java 数据库 MySQL 技术 B/S模式、Java技术 工具 Visual Studio、MySQL数据库开发工具 系统展示 首页 用户注册界面 篮球论坛界面 个人中心界面 摘要 本…

LLM - 循环神经网络(RNN)

1. RNN的关键点:即在处理序列数据时会有顺序的记忆。比如,RNN在处理一个字符串时,在对字母表顺序有记忆的前提下,处理这个字符串会更容易。就像人一样,读取下面第一个字符串会更容易,因为人对字母出现的顺序…

麦蕊智数,,另外一个提供免费的股票数据API,可以通过其提供的接口获取实时和历史的股票数据。

麦蕊智数,,提供免费的股票数据API,可以通过其提供的接口获取实时和历史的股票数据。 API接口:http://api.mairui.club/hslt/new/您的licence 备用接口:http://api1.mairui.club/hslt/new/您的licence 请求频率&#x…

宝可梦 第一到第五时代 神兽 幻兽 准神宝可梦盘点

小时候特别喜欢看宝可梦 也玩过一些宝可梦类游戏 而宝可梦中 大家最喜欢的莫过于神兽 今天 我们来盘点一下 宝可梦各世代的神兽 以及准神宝可梦 第一世代 一级神 超梦 属性: 超能力 是火箭队根据梦幻基因制造的一只人造传说宝可梦。 一直是一只热度非常高的宝可梦&#xf…

无人机有哪些关键技术?

一、控制技术 无人机的核心还是在控制上,飞控系统的可靠性、稳定性及可扩展性是其中重要的指标。可靠性上,除了器件选型之外,目前主要靠多余度来增加;稳定性主要体现在多场景下仍能保持良好的工作状态,主要靠算法来进…

PyQt5中如何实现指示灯点亮和指示灯熄灭功能

一般上位机界面都会涉及指示灯点亮和指示灯熄灭功能,从网上下载该功能的上位机界面,学习如何使用PyQt5搭建具备指示灯点亮和指示灯熄灭效果的界面。 1. 上位机界面的效果展示 使用PyQt5实现以下界面,界面效果如下,界面图片是从网…

浅识Jmeter与浅谈互联网公司高并发业务压测流程痛点

浅谈Jmeter 什么是Jmeter JMeter 是 Apache 软件基金会开发的一个开源软件,用于负载测试和性能测试。它被设计用来模拟多种请求到服务器、网络或对象,以测试其性能。JMeter 可以用于测试静态和动态资源,并且可以模拟各种协议的请求&#xf…

【JVM基础篇】Java的四种垃圾回收算法介绍

文章目录 垃圾回收算法垃圾回收算法的历史和分类垃圾回收算法的评价标准标记清除算法优缺点 复制算法优缺点 标记整理算法(标记压缩算法)优缺点 分代垃圾回收算法(常用)JVM参数设置使用Arthas查看内存分区垃圾回收执行流程分代GC算…

上万组风电,光伏,用户负荷数据分享

上万组风电,光伏,用户负荷数据分享 可用于风光负荷预测等研究 获取链接🔗 https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取码:381i 获取链接🔗 https://pan.baidu.com/s/1izpymx6R3Y8JsFdx42rL0A 提取…

【算法笔记自学】第 5 章 入门篇(3)——数学问题

5.1简单数学 #include <cstdio> #include <algorithm> using namespace std; bool cmp(int a,int b){return a>b; } void to_array(int n,int num[]){for(int i0;i<4;i){num[i]n%10;n /10;} } int to_number(int num[]){int sum0;for(int i0;i<4;i){sumsu…

计算组的妙用!!页面权限控制

需求描述&#xff1a; 某些特殊的场景下&#xff0c;针对某页看板&#xff0c;需要进行数据权限卡控&#xff0c;但是又不能对全部的数据进行RLS处理&#xff0c;这种情况下可以利用计算组来解决这个需求。 实际场景 事实表包含产品维度和销售维度 两个维度属于同一公司下面的…

搭建互联网医院实战:从源码到在线问诊APP的全流程开发

今天&#xff0c;笔者将讲述在线问诊APP的全流程开发&#xff0c;帮助开发者理解和掌握搭建互联网医院的核心技术和步骤。 一、需求分析与设计 需求分析包括明确目标用户、功能需求、性能需求等。设计阶段则包括系统架构设计、数据库设计和前后端界面设计等。 1.目标用户&…

柯桥职场英语学习商务英语口语生活英语培训生活口语学习

辣妹用英语怎么说&#xff1f; 辣妹在英语中通常被翻译为“hot girl”或“spicy girl”&#xff0c;但更常见和直接的是“hot chick”或简单地使用“hot”来形容。 举个例子: Shes a real hot girl with her trendy outfit and confident attitude. 她真是个辣妹&#xff0…

Ubuntu 20版本安装Redis教程

第一步 切换到root用户&#xff0c;使用su命令&#xff0c;进行切换。 输入&#xff1a; su - 第二步 使用apt命令来搜索redis的软件包&#xff0c;输入命令&#xff1a;apt search redis 第三步 选择需要的redis版本进行安装&#xff0c;本次选择默认版本&#xff0c;redis5.…

谷粒商城-记录创建工程和模块时遇到的两个问题

文章目录 一&#xff0c;Maven工程出现Gradle相关的信息1&#xff0c;问题描述2&#xff0c;解决办法 二&#xff0c;找不到maven插件1&#xff0c;问题描述2&#xff0c;解决方案 三&#xff0c;补充知识&#xff1a;Maven和Gradle 这篇记录几个在创建工程和模块后遇到的几个问…

代码随想录算法训练营第四十五天| 300.最长递增子序列、 674. 最长连续递增序列、 718. 最长重复子数组

300.最长递增子序列 题目链接&#xff1a;300.最长递增子序列 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会&#xff0c;递推状态的时候只想着如何从dp[i-1]推导dp[i]&#xff0c;没想过可能需要枚举dp[0-i] 思路&#xff1a; 找出所有比自己小的数字的dp[j],在这些dp…

超过GPT-4V,国产开源多模态大模型来了!支持视频理解/超高分辨率图片理解/多轮对话...

扫码领取享50优惠&#xff01;随时可用&#xff0c;先到先得&#xff01; 大家好&#xff0c;开源多模态大模型真的是每天都在疯狂的涌现&#xff0c;今天分享一个国产大模型 InternLM-XComposer-2.5 中文名&#xff1a;浦语灵笔2.5 仅使用 7B LLM 后端就达到了 GPT-4V 级别的能…

全能PDF工具集 -- PDF Shaper Professional v14.3 特别版

软件简介 PDF Shaper是一款功能强大的PDF工具集&#xff0c;它提供了一系列用于处理PDF文档的工具。这款软件使用户能够轻松地转换、分割、合并、提取页面以及旋转和加密PDF文件。PDF Shaper的界面简洁直观&#xff0c;使得即使是新手用户也能快速上手。它支持广泛的功能&…