并发编程中的各类锁

引言
在并发编程中,锁是一种关键的同步机制,用于控制多个线程对共享资源的访问。不同类型的锁在不同的场景下有着不同的适用性和性能特点。本文将探讨几种常见的锁,包括互斥锁、自旋锁、读写锁、悲观锁和乐观锁,并对它们进行详细总结和比较。

1. 互斥锁(Mutex Lock)
互斥锁是最常见的一种锁机制,用于保护共享资源在任意时刻只能被一个线程访问。当一个线程获取到互斥锁时,其他线程需要等待该线程释放锁后才能访问共享资源。

2. 自旋锁(Spin Lock)
自旋锁是一种忙等待的锁机制,当线程尝试获取锁时,如果锁已经被其他线程占用,该线程会循环等待直到锁可用。自旋锁适用于锁被占用时间较短的情况,避免了线程切换的开销。

3. 读写锁(Read-Write Lock)
读写锁允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。读写锁在读多写少的场景下能够提高并发性能,但在写多读少的情况下可能导致写线程长时间等待。另外,根据实现的不同,读写锁可以分为读优先锁和写优先锁。

读优先锁
读优先锁期望的是,读锁能被更多的线程持有,以便提高读线程的并发性,它的工作方式是:当读线程 A 先持有了读锁,写线程 B 在获取写锁的时候,会被阻塞,并且在阻塞过程中,后续来的读线程 C 仍然可以成功获取读锁,最后直到读线程 A 和 C 释放读锁后,写线程 B 才可以成功获取写锁。

写优先锁
写优先锁是优先服务写线程,其工作方式是:当读线程 A 先持有了读锁,写线程 B 在获取写锁的时候,会被阻塞,并且在阻塞过程中,后续来的读线程 C 获取读锁时会失败,于是读线程 C 将被阻塞在获取读锁的操作,这样只要读线程 A 释放读锁后,写线程 B 就可以成功获取写锁。

但不管优先读锁还是写锁,对方可能会出现饿死问题,那么我们就不偏袒任何一方,搞个公平读写锁。公平读写锁比较简单的一种方式是:用队列把获取锁的线程排队,不管是写线程还是读线程都按照先进先出的原则加锁即可,这样读线程仍然可以并发,也不会出现「饥饿」的现象。

4. 悲观锁(Pessimistic Lock)
悲观锁假设并发访问的情况下会发生冲突,因此在访问共享资源之前先获取锁。互斥锁、自旋锁和读写锁都属于悲观锁的范畴。

5. 乐观锁(Optimistic Lock)
乐观锁假设并发访问的情况下不会发生冲突,因此在访问共享资源之前不会加锁,而是在更新操作时进行版本号或者时间戳的比较来判断是否发生冲突。乐观锁适用于读多写少的情况下,避免了大量的锁竞争。

总结和比较

  • 互斥锁适用于对共享资源的访问需要排他性的情况。
  • 自旋锁适用于锁被占用时间短且线程竞争激烈的情况。
  • 读写锁适用于读多写少的场景,能够提高并发性能。
  • 悲观锁假设并发访问时会发生冲突,因此需要在访问前获取锁。
  • 乐观锁假设并发访问时不会发生冲突,适用于读多写少的情况。

结论:
对于并发编程中的锁机制,选择合适的锁类型至关重要。不同类型的锁在不同场景下有着不同的适用性和性能特点,开发人员需要根据实际情况进行选择和使用。

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

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

相关文章

Golang | Leetcode Golang题解之第58题最后一个单词的长度

题目: 题解: func lengthOfLastWord(s string) (ans int) {index : len(s) - 1for s[index] {index--}for index > 0 && s[index] ! {ansindex--}return }

虚拟机扩容-根目录挂载sda1的空间不足

提醒!不管成不成功,一定要先备份一份虚拟机!!!!! 走过路过点个关注吧,想到500粉丝,哭。一、查看分区情况 df -h可以看到/dev/sda1已经被占满了 2.关闭虚拟机&#xff…

windows驱动开发-WDF对象

WDF封装了大量的WDF对象,不过,和应用层不一样,不用去尝试从WDF框架对象类上派生和改写原有的WDF类,本意WDF就是希望我们使用这些对象和类,而不是创造新的奇怪的类。 每个WDF对象都代表着对一项驱动需要使用的子功能的…

vue学习的预备知识为学好vue打好基础

目录 Vue是什么 ?如何使用Vue ?Vue ApiVue入口apiVue实例apiVue函数api 无构建过程的渐进式增强静态HTMLVue模块化构建工具npmyarnWebpackvue-cliVite Vue是什么 ? 文章基于Vue3叙述。 Vue (发音为 /vjuː/,类似 view) 是一款用于…

179. 最大数(LeetCode)

文章目录 前言一、题目讲解二、算法原理三、代码编写1.仿函数写法2.lambda表达式 四、验证五.总结 前言 在本篇文章中,我们将会带着大家采用贪心的方法解决LeetCode中最大数这道问题!!! 一、题目讲解 一组非负整数,包…

【面试经典 150 | 图】被围绕的区域

文章目录 写在前面Tag题目来源解题思路方法一:深搜方法二:广搜 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的…

03.Kafka 基本使用

Kafka 提供了一系列脚本用于命令行来操作 kafka。 1 Topic 操作 1.1 创建 Topic 创建一个名为 oldersix-topic 的 topic,副本数设置为3,分区数设置为2: bin/kafka-topics.sh \ --create \ --zookeeper 192.168.31.162:2181 \ --replication…

ROS1快速入门学习笔记 - 07话题消息的定义与使用

目录 一、话题模型 二、自定义话题消息 1. 在功能包下创建msg目录用于存储话题文件 2. 在package.xml文件中添加功能包依赖; 3. 在CMakeLists.txt增加编译选项; 4. 完成编译 5. 配置CMakeLists.txt中的编译规则(增加发布者和订阅者&am…

卫浴品牌商家做展示预约小程序的作用是什么

卫浴品牌类别多、普通/智能、场景化等,无论企业还是经销商市场门店都比较饱满,虽然市场需求度高,但同样需要商家不断拓宽销售渠道和挖掘客户价值,破圈增长。 线上多平台发展尤为重要,而小程序作为连接点,对…

ctf web-部分

** web基础知识 ** *一.反序列化 在PHP中,反序列化通常是指将序列化后的字节转换回原始的PHP对象或数据结构的过程。PHP中的序列化和反序列化通过serialize()和unserialize()函数实现。 1.序列化serialize() 序列化说通俗点就是把一个对象变成可以传输的字符串…

就业班 第三阶段(nginx) 2401--4.26 day5 nginx5 nginx https部署实战

三、HTTPS 基本原理 1、https 介绍 HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer),其实 HTTPS 并不是一个新鲜协议,Google 很早就开始启用了,初衷是为了保证数据安全。 近些年&…

ArcGIS小技巧—模型构建器快速提取河网

上篇文章介绍的基于DEM的河网提取,需要使用多个工具,整体操作比较繁琐,在日常工作中,使用Arcgis提供的模型构建器可以帮助我们将多个工具整合在一起,在面对大量数据批量处理时,可以大大提高工作效率 利用模…

【题解】—— LeetCode一周小结17

【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结16 22.组合总和 Ⅳ 题目链接:377. 组合总和 Ⅳ 给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数…

基于SSM的“个性化电子相册”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“个性化电子相册”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 个性化电子相册功能结构图 系统后台界面 会员信息管理界面 相…

在网站源码后台增加响应式布局

一本教材上的网站源码,后台在手机上查看还是按照电脑的页面样式,不方便查看和发布新内容。教材上讲了响应式布局。对于页面结构简单的网站,可以利用响应式,使页面自动适用各种屏幕的分辨率。 今天在一个网站源码的后台使用了响应…

经典案例:学习 Java 异常处理的最佳实践

哈喽,各位小伙伴们,你们好呀,我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。 我是一名后…

OpenCV如何模板匹配

返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV如何实现背投 下一篇 :OpenCV在图像中寻找轮廓 目标 在本教程中,您将学习如何: 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入图像之间…

为什么我的Mac运行速度变慢 mac运行速度慢怎么办 如何使用CleanMyMac X修复它

近些年伴随着苹果生态的蓬勃发展,越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现,它的使用逻辑与Windows存在很多不同,而且随着使用时间的增加,一些奇奇怪怪的文件也会占据有限的磁盘空间,进而影响使用…

电脑已经有了一个Windows10,再多装一个Windows10组成双系统

前言 前段时间已经讲过一次双Windows系统的安装教程,但是小白重新去看了一下,发现写的内容太多,怕小伙伴看了之后一脸萌。 所以今天咱们就重新再来讲讲:在同一台机器上安装Windows10双系统的教程。 注意哦!这里的Wi…

用来传输文件的协议-FTP

一.FTP协议--文件传输协议 1.了解FTP协议 (1)FTP服务是用来传输文件的协议 FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一,用于互联网上的控制文件的双向传输。是传输文件到Linu…
最新文章