【锁】各种锁的概念

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

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

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.mzph.cn/web/40786.shtml

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

相关文章

Redis---9---集群(cluster)

将新增的6387节点(空槽号)作为master节点加入原集群 Redis—9—集群(cluster) 是什么 定义 ​ 由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复…

Selenium 切换窗口

环境: Python 3.8 selenium3.141.0 urllib31.26.19说明: driver.current_window_handle # 返回当前窗口的句柄 driver.window_handles # 返回当前由driver启动所有窗口句柄,是个列表 driver.switch_to.window(handle) # 根据 handle 切换窗口…

5个实用的文章生成器,高效输出优质文章

在自媒体时代,优质内容的持续输出是吸引读者、提升影响力的关键。然而,对于许多自媒体创作者来说,频繁的创作难免会遭遇灵感枯竭、创作不出文章的困扰。此时,文章生成器便成为了得力的助手。文章生成器的优势能够快速自动生成高质…

代码随想录算法训练营第13天|二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代法、102.二叉树的层序遍历

打卡Day13 1.理论基础2.二叉树的递归遍历3.二叉树的迭代遍历3.二叉树的统一迭代法4.102.二叉树的层序遍历扩展107. 二叉树的层序遍历 II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针117. 填充每个…

如何保证接口幂等性

如何保证接口幂等性 1、幂等性是什么? 接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了不同的结果。 2、使用幂等性的场景有哪些? 页面点击保存按钮时,不小心快速点了两次…

Python面试题-6

1. 请解释Python中的动态类型。 Python中的动态类型 Python是一种动态类型语言,这意味着你不需要在编程时声明变量的类型,而是在运行时自动推断类型。在Python中,变量的类型是在程序运行时决定的,这意味着同一个变量可以在不改变…

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

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

一行代码用git新建分支

1.在本地创建分支 dev git branch dev2.切换分支 git checkout devwebstorm操作如下: 3.推送新分支到远程 git push --set-upstream origin 分支名webstorm操作如下:提交代码的时候会自动推送到远程 4.到git上面可以看看刚刚推送的内容 dev多推送…

Proxmox VE 8虚拟机直通USB磁盘

作者:田逸(fromyz) 今天有个兄弟发消息,咨询怎么让插在服务器上的U盾被Proxmox VE上的虚拟机识别。在很久很久以前,我尝试过在Proxmox VE 5以前的版本创建windows虚拟机,并把插在Proxmox VE宿主机上的银行U…

基于STM32设计的智能喂养系统(ESP8266+微信小程序)175

基于STM32设计的牛羊喂养系统(微信小程序)(175) 文章目录 一、前言1.1 项目介绍【1】项目功能介绍【2】项目硬件模块组成【3】ESP8266工作模式配置【4】上位机开发【5】项目模块划分1.2 项目功能需求1.3 项目开发背景1.4 开发工具的选择1.5 系统框架图1.6 系统原理图1.7 硬件实…

Android ViewPostImeInputStage输入事件处理

InputDispatcher向InputChannel使用socket写入输入事件,触发InputEventReceiver调用来接收输入事件。 ViewPostImeInputStage处理view控件的事件 frameworks/base/core/java/android/view/InputEventReceiver.java dispatchInputEvent frameworks/base/core/jav…

SwinTransformer的相对位置索引的原理以及源码分析

文章目录 1. 理论分析2. 完整代码 引用:参考博客链接 1. 理论分析 根据论文中提供的公式可知是在 Q Q Q和 K K K进行匹配并除以 d \sqrt d d ​ 后加上了相对位置偏执 B B B。 A t t e n t i o n ( Q , K , V ) S o f t m a x ( Q K T d B ) V \begin{aligned} &…

绝了,华为伸缩摄像头如何突破影像边界?

自华为Pura70 Ultra超聚光伸缩镜头诞生以来,备受大家的关注,听说这颗镜头打破了传统手机的摄像头体积与镜头的设计,为我们带来了不一样的拍照体验。 智能手机飞速发展的今天,影像功能已经成为我们衡量一款手机性能的重要指标。想…

MySQL中mycat与mha应用

目录 一.Mycat代理服务器 1.Mycat应用场景 2.mycat安装目录结构说明 3.Mycat的常用配置文件 4.Mycat日志 5.mycat 实现读写分离 二.MySQL高可用 1.原理过程 2.MHA软件 3.实现MHA 一.Mycat代理服务器 1.Mycat应用场景 Mycat适用的场景很丰富,以下是几个典型…

进程输入输出及终端属性学习

进程的标准输入输出 当主进程fork或exec子进程,文件描述符被继承,因此0,1,2句柄也被继承,从而使得telnet等服务,可以做到间接调用别的shell或程序。比如如果是远程登录使用的zsh,那么其会重定向到相应的pts $ ps|gre…

沪上繁花:上海电信的5G-A之跃

2024年6月18日下午,在上海举行的3GPP RAN第104次会议上,3GPP正式宣布R18标准冻结。R18是无线网络面向5G-A的第一个版本,其成功冻结正式宣布了5G发展迎来新机遇,5G-A商用已进入全新的发展阶段。 在5G-A滚滚而来的时代洪流中&#x…

C#实战|账号管理系统:通用登录窗体的实现。

哈喽,你好啊,我是雷工! 本节记录登录窗体的实现方法,比较有通用性,所有的项目登录窗体实现基本都是这个实现思路。 一通百通,以下为学习笔记。 01 登录窗体的逻辑 用户在登录窗输入账号和密码,如果输入账号和密码信息正确,点击【登录】按钮,则跳转显示主窗体,同时在固…

Vue3项目初始化:

紧接着前面的文章:https://blog.csdn.net/weixin_51416826/article/details/138679863?spm1001.2014.3001.5502 当我们生成一个Vue3项目后必须要增加一些依赖和配置,比如安装组件库、配置ESLint和Prettier、接下来咱一步步推进~ 安装组件库 一般开发…

【基础篇】1.7 C语言基础(一)

一,为什么是C语言? C语言是嵌入式系统开发领域广泛使用的编程语言。STM32作为一种嵌入式系统的微控制器,需要精确控制硬件资源,那么C语言能够满足这一需求。 二,STM32 C语言常用基础知识 下面是我们在日常STM32开发中必备的C语言基础要点,掌握这些C语言的基础知识要点…

llama3

Llama 3是由Meta公司发布的一款大型语言模型(LLM),该模型在发布后迅速引起了业界的广泛关注。以下是对Llama 3的详细介绍: 一、基本信息 发布单位:Meta公司 发布时间:当地时间2024年4月18日 主要特点&…