常见的锁策略

目录

一、乐观锁与悲观锁

二、重量级锁与轻量级锁

三、自旋锁

四、公平锁与不公平锁

五、可重入锁与不可重入锁

六、读写锁


一、乐观锁与悲观锁

乐观锁:乐观锁认为在大多数情况下,数据一般不会并发冲突,所以在数据进行提交更新的时候,才会正式对数据是否产生并发冲突进行检测,如果发现并发冲突了,则让返回用户错误的信息,让用户决定如何去做。

悲观锁:悲观锁认为在并发环境下,数据冲突是常态。因此,它会在数据被读取时就加锁,就每次拿数据的时候都会进行一次上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。

        例如在生活职场上,有一个比较重要的项目需要小组去做,而在流程进行中,有一些东西需要请示领导,而在这个时候有俩个员工,分别是员工A和员工B都需要去请示一次领导,员工A认为领导是比较忙的,所以在员工需要请示领导的时候首先在微信跟领导说一下(相当于加锁操作),得到肯定的答复之后,才会去领导的办公室进行商讨,如果得到的是否定的答复,那么就等待一段时间,再进行时间的确认,这个就是悲观锁。

        而员工B认为领导是比较闲的,所以找他商讨项目的事情大概率是有空解答的。因此员工B直接去领导办公室找他,如果领导在的话,问题就解决了,如果不在,就下次再来(虽然没加锁, 但是能识别出数据访问冲突). 这个是乐观锁.​。

        俩个锁的各有其优缺点。

        如果领导确实比较忙,那么使用悲观锁的策略更合适,使用乐观锁就会导致“白跑很多趟”,消耗的资源比较多。

        如果领导确实比较闲的话,那么乐观锁的策略更合适,悲观锁会让效率比较低。

        而在java中,Synchronized 初始使用乐观锁策略. 当发现锁竞争比较频繁的时候, 就会自动切换成悲观锁策略.​

二、重量级锁与轻量级锁

        锁的核心特性 "原子性", 这样的机制追根溯源是 CPU 这样的硬件设备提供的.​

重量级锁
特点

        基于内核:重量级锁的实现依赖于操作系统的内核机制。当线程尝试获取一个已经被占用的重量级锁时,线程会被挂起(阻塞),并进入内核态等待锁的释放。

        性能开销大:由于涉及到用户态与内核态的切换,以及线程的挂起和唤醒操作,重量级锁的性能开销较大。每次加锁或解锁都需要消耗较多的系统资源。

        适用场景:适用于锁持有时间较长的场景,因为在这种情况下,重量级锁的开销相对锁的持有时间可以忽略不计。

轻量级锁

        轻量级锁是一种优化的锁机制,旨在减少锁操作的开销,提高多线程程序的性能

特点

        基于用户态:轻量级锁的实现主要在用户态完成,尽量避免进入内核态。当线程尝试获取一个已经被占用的轻量级锁时,线程不会立即被挂起,而是会尝试通过自旋(Spin)等方式等待锁的释放。

        性能开销小:由于减少了内核态切换和线程阻塞的开销,轻量级锁在锁竞争不激烈的情况下性能更高。

        适用场景:适用于锁持有时间非常短的场景,因为在这种情况下,自旋等待锁释放的开销比线程阻塞和唤醒的开销要小。

synchronized 开始是一个轻量级锁. 如果锁冲突比较严重, 就会变成重量级锁.​

三、自旋锁

        线程在抢锁失败后进入阻塞状态,放弃 CPU,需要过很久才能再次被调度.。这样就可以使用挂起等待锁(就不尝试抢锁,等待锁释放,通过其他的方式进行抢锁)。

        而自旋锁是什么,就类似于无限循环,如果拿锁失败,会在极短的时间内再次尝试拿起锁。伪代码如下:

 while (抢锁(lock) == 失败) {}

         比较适用于锁释放时间短的场景,如果抢锁失败,过不了多久锁会被释放,那就没必要放弃cpu,这个时候就可以使用自旋锁来处理这样的问题.。

四、公平锁与不公平锁

        公平锁与非公平锁是什么呢?公平锁讲究的是“先进先出”,而非公平锁就不讲究“先进先出”。而在线程调度这边,是随机调度的,我们可以认为这是不公平的,如果想要让其变公平,则需要通过一些额外数据结构,记录其线程调度顺序,来让其公平,否则就不行。

          synchronized 是非公平锁。    

五、可重入锁与不可重入锁

        

        可重入锁的字面意思是“可以重新进入的锁”,即允许同一个线程多次获取同一把锁。简单理解就是,可重入锁不至于把“自己”锁死,而不可重入锁有可能会把自己锁死。

        例如:java中synchronized 是可以重入的。

synchronized (object1){synchronized(object1){try {object1.wait(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}

        在上面的代码中,用了俩次synchronized,其实效果和用一次是一样的,因为在Java里面的锁是可重入的,而不可重入锁如一个简单的互斥锁(Mutex),但在性能这边,不可重入锁的性能会更好,而缺点就是不能存在于递归的场景。

 

六、读写锁

        读写锁是一种特殊的锁,它允许多个线程之间同时读取共享资源,但写入操作是互斥的。也就是说,在写入操作时,任何线程(无论是读线程还是写线程)都不能访问共享资源

        总的来说:

        俩个线程都只是读一个数据,此时并没有线程安全问题,直接并发的读取即可。(读加锁与读加锁,不互斥

        俩个线程都要写一个数据,有线程安全问题。(写加锁和写加锁,互斥

        一个先后曾读另外一个先后曾写,也有线程安全问题。(读加锁和写加锁之间,互斥

        Java标准库中提供了提供了ReentrantReadWriteLock类,实现了读写锁,其中ReentrantReadWriteLock.ReadLock类表示一个读锁.这个对象提供了lock/unlock方法进行加锁解锁.,还提供了ReentrantReadwriteLock.WriteLock类表示一个写锁,这个对象也提供了lock/unlock方法进行加锁解锁.

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

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

相关文章

Linux的进程信号 -- 信号产生,信号保存,信号捕捉,硬件中断,内核态和用户态,可重入函数,volatile,SIGCHLD

目录 1. 认识信号 1.1 信号的定义和基本结论 1.1.1 查看信号 1.2 技术应用角度的信号 1.2.1 一个样例 1.2.2 系统调用 signal 函数 1.3 信号的处理 2. 信号的产生 2.1 通过终端按键产生信号 2.1.1 基本操作 2.1.2 理解操作系统如何得知键盘信号 2.1.3 初步理解信号…

知识库中嵌入模型(Embedding Models)与重排序模型(Re-ranking Models)推荐工具与库

一、引言 在当今信息爆炸的时代,企业和组织面对海量数据时,如何快速、准确地检索和利用知识成为一项关键技术。知识库作为信息管理和知识发现的核心平台,已经广泛应用于搜索引擎、问答系统、智能客服、推荐系统等领域。然而,传统…

C++调用Python

Python安装 地址: python官网 可以根据需要下载对应的版本。 调用python python测试脚本 # my_script.py import sys import jsondef calculate(a, b):return a * b 10 # 示例计算逻辑if __name__ "__main__":# 从命令行参数读取 JSON 字符串try…

Linux 中查看文件大小方法

目录 方法一:ls -l 输出的第五列方法二:du 命令的输出信息方法三:stat -c %s 的输出 方法一:ls -l 输出的第五列 ls 是列出指定目录下文件列表的命令,通过 -l 选项可以显示文件的属性信息,第五列显示的就是…

初识Qt(一)

本文部分ppt、视频截图原链接:萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频 1. Qt是什么? Qt是一个跨平台的C应用程序开发框架,它既为图形用户界面(GUI)程序开发提供了强大支持,也能用于开发非GUI的控制台程序、服务端…

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗

docker - compose up - d`命令解释,重复运行会覆盖原有容器吗 docker - compose up - d 是一个用于管理 Docker 容器的命令,具体含义如下: 命令含义: up:用于创建、启动并运行容器,会根据 docker - compose.yml 文件中定义的服务配置来操作。-d:表示以“分离模式”(det…

《2核2G阿里云神操作!Ubuntu+Ollama低成本部署Deepseek模型实战》

简介: “本文为AI开发者揭秘如何在阿里云2核2G轻量级ECS服务器上,通过Ubuntu系统与Ollama框架实现Deepseek模型的高效部署。无需昂贵硬件,手把手教程涵盖环境配置、资源优化及避坑指南,助力初学者用极低成本在云端跑通行业领先的大…

DexGrasp Anything:具有物理-觉察的普遍机器人灵巧抓取

25年3月来自上海科技大学的论文“DexGrasp Anything: Towards Universal Robotic Dexterous Grasping with Physics Awareness”。 能够抓取任何物体的灵巧手,对于通用具身智能机器人的开发至关重要。然而,由于灵巧手的自由度高,物体种类繁多…

COMPASS:通过残差强化学习和技能合成实现跨具身移动策略

25年2月来自 Nvidia、UC Berkeley 和 UT Austin 的论文“COMPASS: Cross-embOdiment Mobility Policy via ResiduAl RL and Skill Synthesis”。 随着机器人越来越多地部署在不同的应用领域,可泛化的跨具身移动策略变得越来越重要。虽然经典的移动栈已被证明在特定…

win10下python脚本运行缺失ccache的问题处理

问题 python脚本运行时,会提醒参考 https://github.com/ccache/ccache/blob/master/doc/INSTALL.md 处理缺失ccache的问题。 下载编译 下载ccache主干版本, 例如 https://github.com/ccache/ccache/archive/refs/heads/master.zip 按照说明编译 mkd…

跨语言语言模型预训练

摘要 最近的研究表明,生成式预训练在英语自然语言理解任务中表现出较高的效率。在本研究中,我们将这一方法扩展到多种语言,并展示跨语言预训练的有效性。我们提出了两种学习跨语言语言模型(XLM)的方法:一种…

3月28号

今天写了一些算法题: P1866 编号 题目描述 太郎有 N 只兔子,现在为了方便识别它们,太郎要给他们编号。兔子们向太郎表达了它们对号码的喜好,每个兔子 i 想要一个整数,介于 1 和 Mi​ 之间(可以为 1 或 Mi​&#xf…

数据结构与算法:2,冒泡排序

以从小到大排序为例: 冒泡排序步骤: 1,从左到右(或从右到左)对比相邻两个数,左边的数 大于 右边的数 则交换位置 2,重复第一个步骤 ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​…

从春招“AI热潮”看科技变革中的就业新趋势

随着2025年春招市场的火热进行,人工智能(AI)相关岗位成为求职市场上的“香饽饽”,引发了社会各界的广泛关注。这一现象背后,不仅反映了AI技术的快速发展,更揭示了科技变革对就业市场带来的深远影响。从春招…

人工智能之数学基础:矩阵的相似变换

本文重点 矩阵的相似变换是线性代数中一个至关重要的概念,它揭示了矩阵之间的一种特殊关系,并通过可逆矩阵将一个矩阵转化为另一个相似矩阵,同时保持矩阵的某些本质特征不变。在机器学习领域,矩阵的相似变换发挥着不可或缺的作用,广泛应用于数据降维、聚类分析、分类推荐…

docker torcherve打包mar包并部署模型

使用Docker打包深度网络模型mar包到服务端 参考链接:Docker torchserve 部署模型流程——以WSL部署YOLO-FaceV2为例_class myhandler(basehandler): def initialize(self,-CSDN博客 1、docker拉取环境镜像命令 docker images出现此提示为没有权限取执行命令&…

JAVA实现动态IP黑名单过滤

一些恶意用户(可能是黑客、爬虫、DDoS 攻击者)可能频繁请求服务器资源,导致资源占用过高。因此需要一定的手段实时阻止可疑或恶意的用户,减少攻击风险。 通过 IP 封禁,可以有效拉黑攻击者,防止资源被滥用,保障合法用户…

RocketMQ可视化工具使用 - Dashboard(保姆级教程)

1、github拉取代码,地址: https://github.com/apache/rocketmq-dashboard 2、指定Program arguments,本地启动工程 勾上这个Program arguments,会出现多一个对应的框 写入参数 --server.port1280 --rocketmq.config.namesrvAddr…

湖南(源点咨询)市场调研 商业综合体定位调研分享(上篇)

​ 该项目位于某新一线城市的城市副中心区域,系一个正在发展中的中央居住区,项目本身是一个涵盖社区综合服务中心、商业、文体活动中心、卫生服务、社区养老等多功能复合的公共配套项目,本次调研主要针对其商业(及其他可商用的&a…

硬件测试工装设计不合理的补救措施

硬件测试工装设计不合理的补救措施主要包括重新评估设计需求、优化工装结构、强化工装校准与验证。其中,优化工装结构尤其重要,通过结构优化能够有效解决因设计不合理导致的测试准确性下降和可靠性不足的问题。根据工程实践数据,经过优化结构…