常见锁策略总结:从悲观锁到自旋锁

news2024/10/12 17:48:02

欢迎浏览高耳机的博客

希望我们彼此都有更好的收获

感谢三连支持!

 在多线程编程中,锁是保证数据一致性和线程安全的重要机制.本文将直观且简洁的介绍常见的锁策略,包括它们的基本逻辑,使用场景以及优缺点.

悲观锁 与 乐观锁 

悲观锁:预防性策略

悲观锁是一种主动锁定策略,它假设最坏的情况,即冲突总是会发生。在数据被访问时,悲观锁会直接将数据锁定,以防止其他线程的修改。这种策略适用于写操作频繁的场景,可以通过数据库的排它锁或代码中的synchronized关键字实现 

特点:

  • 适用于写操作多的场景。
  • 可以防止脏读和不可重复读。

乐观锁:事后检查

 与悲观锁相反,乐观锁是一种被动锁定策略,它假设冲突很少发生。在数据被访问时,乐观锁不会直接锁定数据,而是在数据提交时检查是否发生了冲突。它允许多个线程同时访问数据,如果检测到冲突,乐观锁会回滚并重试操作。这种策略适用于读操作多的场景

特点

  • 适用于读操作多的场景。
  • 通过版本号或CAS(Compare-And-Swap)操作实现。

实现方式

  • 通常使用数据库的乐观锁机制或在代码中使用Atomic类。

 重量级锁 与 轻量级锁: 性能考量

重量级锁 

 重量级锁是指操作系统级别的锁,它涉及到用户态和内核态的切换,因此开销较大

特点

  • 适用于需要严格同步的场景。
  • 实现了操作系统级别的同步。

轻量级锁 

轻量级锁是指在用户态实现的锁,它避免了用户态和内核态之间的切换,因此开销较小。

特点

  • 适用于锁竞争激烈的场景。
  • 实现了用户态的同步。

重量级锁和轻量级锁的区别在于操作系统的介入程度。重量级锁涉及到用户态和内核态的切换,因此开销较大,适用于锁竞争激烈的场景。而轻量级锁在用户态实现,避免了切换开销,适用于锁竞争不激烈或锁持有时间短的场景  

挂起等待锁 与 自旋锁 : 阻塞VS忙等待

挂起等待锁

挂起等待锁是一种当锁不可用时,将线程挂起等待的锁策略。这种策略可以减少CPU的占用,但在锁竞争激烈时可能会导致线程调度开销。

特点

  • 当锁不可用时,线程会被挂起。
  • 适用于锁持有时间短的场景。

实现方式

  • 通常通过操作系统的线程挂起和唤醒机制实现。

自旋锁

 自旋锁是一种忙等待策略,当锁不可用时,线程不断循环检查锁状态的锁策略。这种策略可以减少线程调度的开销,但在锁持有时间长时可能会导致CPU资源浪费。

特点

  • 当锁不可用时,线程会不断自旋检查。
  • 适用于锁持有时间短且CPU资源充足的场景。

实现方式

  • 通常通过循环检查锁状态的代码实现。

公平锁 与 非公平锁: 锁的分配策略

公平锁

与我们生活中所谓的"公平"不同,公平锁是指按照线程请求锁的顺序来分配锁的策略,以"先来后到"作为基准,而不是为每个线程平均分配锁。这种策略可以保证线程的公平性,但可能会降低系统的吞吐量。

特点

  • 保证了线程请求锁的顺序。
  • 适用于需要保证公平性的场景。

实现方式

  • 通常通过队列来管理线程的请求顺序。

非公平锁 

非公平锁是指不保证线程请求锁的顺序,哪个线程先抢到锁就分配给哪个线程的策略。这种策略可以提高系统的吞吐量,但可能会导致线程饥饿。

特点

  • 不保证线程请求锁的顺序。
  • 适用于对吞吐量要求高的场景。

实现方式

  • 通常直接尝试获取锁,不进行排队。

公平锁确保线程获取锁的顺序与其请求顺序一致,而非公平锁则不保证这一点。公平锁可以减少线程饥饿,但可能会降低系统的吞吐量。非公平锁可能会提高吞吐量,但增加线程饥饿的风险 

可重入锁 与 不可重入锁: 锁的重入性

可重入锁

可重入锁是指一个线程可以多次获取同一把锁的策略。这种策略可以避免死锁,但可能会增加锁的管理复杂度。

特点

  • 同一线程可以多次获取同一把锁。
  • 适用于递归调用或多层嵌套的场景。

实现方式

  • 通常通过维护一个计数器来记录同一个线程获取锁的次数。

不可重入锁 

不可重入锁是指一个线程不能多次获取同一把锁的策略。这种策略可以减少锁的管理复杂度,但可能会导致死锁。

特点

  • 同一线程不能多次获取同一把锁。
  • 适用于简单的同步场景。

实现方式

  • 通常直接尝试获取锁,不考虑重入的情况。

读写锁: 平衡读与写 

读写锁是一种特殊类型的锁,允许多个读操作同时进行,但写操作需要独占访问的锁策略。这种策略适用于读操作多于写操作的场景,可以提高系统的并发性,但可能会增加锁的管理复杂度。

特点

  • 允许多个读操作同时进行。
  • 写操作需要独占访问。
  • 适用于读操作多于写操作的场景。

实现方式

  • 通常通过维护读锁和写锁两个锁,分别控制读操作和写操作。

Synchronized优化过程: 锁的优化策略

在Java中,synchronized关键字有一些优化策略,以减少锁的开销:

锁消除

锁消除是指编译器在编译期间,如果确定一个锁不会被其他线程访问,就消除这个锁的过程。这种策略可以减少锁的开销,提高程序的执行效率。

粒度 与 锁粗化

粒度是指锁的作用范围。细粒度锁可以提高程序的并发性,但会增加锁的管理复杂度。粗粒度锁可以减少锁的管理复杂度,但可能会降低程序的并发性。

锁粗化是指将多个细小的锁操作合并成一个大的锁操作的过程。这种策略可以减少锁的开销,但可能会降低程序的并发性。

总结

在多线程编程的世界中,锁策略的选择对于确保数据一致性、提高系统性能以及优化资源利用至关重要。每种锁策略都有其独特的应用场景和性能考量。随着我们对这些锁策略的深入理解,我们可以更加精准地选择或设计适合特定应用需求的同步机制。这些策略都是我们在构建高效、稳定系统时的重要工具。


希望这篇博客能为你理解常见的锁策略提供一些帮助。

如有不足之处请多多指出。

我是高耳机。

 

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

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

相关文章

Pandas处理时间序列之预测

import pandas as pd import numpy as np import matplotlib.pylab as plt %matplotlib inline from matplotlib.pylab import rcParams rcParams[figure.figsize] 15, 6 一、移动平均过程(MA) 移动平均过程(Moving Average process&#…

机器学习——自动化机器学习(AutoML)

机器学习——自动化机器学习(AutoML) 自动化机器学习(AutoML)——2024年的新趋势什么是AutoML?AutoML的关键组成部分AutoML的优势AutoML 实例:使用Auto-sklearn进行回归分析AutoML的应用领域2024年值得关注…

webm格式怎么转换成mp4?这几种方法可以轻松完成视频转换!

webm格式怎么转换成mp4?WebM,作为一种新兴的视频文件格式,尽管携带了众多优势,却也不乏其固有的局限性,这些局限在实际应用中尤为凸显,成为了用户关注的焦点。本文将深入探讨WebM格式面临的挑战&#xff0c…

Compose第六弹 对话框与弹窗

1.compose中怎么使用对话框? 2.怎么显示Popup弹窗? 一、Compose显示对话框 二、Popup Popup就类似以前的Popupwindow,我们可以看到其实上面的DropdownMenu是Popup的一个具体实现。 2.1 Popup定义 Popup的定义如下: Composable…

ANSYS apdl界面频繁停止工作,需要卸载重装吗

如果经常出现以上报错界面,无需重装,一般是因为你在此图形显示界面滚动了鼠标滚轮,导致ANSYS停止工作 出现这个界面是因为前一次ANSYS非正常退出,再次进入就会出现

天塌了!「系分」新教程10月出版?11月软考会用到新内容吗?

软考教程改版相关事宜一直都有在关注,今天,发现“中国权威的出版物数据服务平台”网站更新了软考教程出版信息。 01、系统分析师新版教程 2024年8月,在“中国权威的出版物数据服务平台”网站搜索“系统分析师教程”显示的出版时间是2024年&a…

自动化运维:提升效率、降低风险的利器

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

【.net core使用minio大文件分片上传】.net core使用minio大文件分片上传以及断点续传、秒传思路

版本:.net core 7 需求:net限制了上传的大小,只能上传25M上下的文件,如果上传一个八十多兆的文件,swagger接口报错,如果前端调用上传接口,会报CORS跨域错误,这篇文章介绍怎么使用分片…

高德地图怎么定位自己的店铺?

随着科技的飞速发展,我们的生活也变得更加便利,很多时候只需要一台手机便能解决许多问题,出行方面同样如此。无论你想去哪里,只要在地图导航上输入相应地址,就能随时导航前往目的地。而高德地图作为国内首屈一指的地图…

基于yolov8、yolov5的果蔬检测系统(含UI界面、数据集、训练好的模型、Python代码)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 , 直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有 GPU&#xff0…

行测刷题(1)

D D C 论据论点话题不一致优先考虑拆桥,要切断论点和论据之间的联系,一般拆桥的选项都要包含论点和论据不一样的关键词,也就是道德责任和舆论批评 体重变化较小可能也发生了体重减少的状况 主题词:人工培育的水稻 要表示文章对策,…

数学建模算法与应用 第11章 偏最小二乘回归及其方法

目录 11.1 偏最小二乘回归概述 11.2 Matlab 偏最小二乘回归命令 Matlab代码示例:偏最小二乘回归 11.3 案例分析:化学反应中的偏最小二乘回归 Matlab代码示例:光谱数据的PLS回归 习题 11 总结 偏最小二乘回归(Partial Least …

Python字符编码详解!

本文简单介绍了各种常用的字符编码的特点,并介绍了在python2.x中如何与编码问题作战 :) 请注意本文关于Python的内容仅适用于2.x,3.x中str和unicode有翻天覆地的变化,请查阅其他相关文档。 文章开始前打个小广告——分…

ES创建文档,使用postman调用请求

请求的url 地址是http://192.168.1.108:9200/shopping/_doc,请求方式为post, 请求参数为: { "title":"小米手机", "category":"小米", "images":"http://www.gulixueyuan.com/xm.jpg", "price&…

系统移植一

使用设备是fs4412开发板 一、系统移植 系统移植是将一个操作系统或软件从一个硬件平台或处理器架构转移到另一个平台的过程。系统移植的主要目标是使软件在新的硬件环境下能够正常运行。在系统移植过程中,主要的改动集中在硬件相关的底层部分以及操作系统的核心模…

开源代码编译过程中遇到的问题(持续更新)

一、A-LOAM 地址:GitHub - HKUST-Aerial-Robotics/A-LOAM: Advanced implementation of LOAM 1.error: ‘LocalParameterization’ is not a member of ‘ceres 原因:ceres 版本的问题,A-LOAM 使用的 ceres 版本过低。如果安装的是 ceres 2.2…

大模型微调方法总结(非常详细)零基础入门到精通,收藏这一篇就够了

大模型训练代价很高,国盛证券出过一个报告《ChatGPT需要多少算力》,指出GPT3(175B)训练一次成本约140万刀,大概是1千万人民币。GPT3已经是2020年的历史了,现在的训练成本可能更高。高昂的训练成本小公司难以…

【ARM汇编速成】零基础入门汇编语言(ARM架构+汇编的实际应用)

目录 一.汇编的前世今生 二.寄存器 三.ARM指令集 1.指令格式 2.寻址方式 3.伪指令 4.基本指令 4.1数据传输指令 4.2存储器访问指令 4.3压栈和出栈指令 4.4跳转指令 4.5算术运算指令 4.6逻辑运算指令 四.C语言与汇编混合编程 1.混合编程前置条件 2.混合编程优势 3.…

活码的3步生成技巧,多种内容快速在线做成二维码

二维码在很多应用场景中都有应用,很多内容可以通过生成活码二维码的方法来提供内容展示。活码可以将多种不同内容给组合展示,而且可以随时在图案不变情况下修改内容,使用起来更加的灵活,常见的活码类型有文本、文件、音视频、图片…

Spring Boot在B2B医疗平台中的病历管理创新

第4章 系统设计 4.1 系统总体设计 系统不仅要求功能完善,而且还要界面友好,因此,对于一个成功的系统设计,功能模块的设计是关键。由于本系统可执行的是一般性质的学习信息管理工作,本系统具有一般适用性,其…