线程安全的锁策略,你到底忽略了多少?

news/2024/11/28 11:52:10/

线程安全的锁策略,你到底忽略了多少?

文章目录

  • 线程安全的锁策略,你到底忽略了多少?
    • 一,🔰乐观锁vs悲观锁
    • 二,📍轻量级锁 vs 重量级锁
    • 三,📍自旋锁 vs 挂起等待锁
    • 四,📍互斥锁 vs 读写锁
    • 五,📍可重入锁 vs 不可重入锁
    • 六,📍公平锁 vs 非公平锁

一,🔰乐观锁vs悲观锁

锁的实现者,预测接下来锁冲突的概率高还是低,根据冲突概率,来进行相应的操作。

乐观锁🔒:预测冲突概率较小,对锁冲突保持积极态度

悲观锁🔒:预测冲突概率较大,对锁冲突保持消极态度

二,📍轻量级锁 vs 重量级锁

轻量级锁🔒:加锁解锁更快更加高效

重量级锁🔒:加锁解锁非常慢十分低效

三,📍自旋锁 vs 挂起等待锁

自旋锁🔒:(轻量级锁)在解锁后,自旋锁会不停歇的寻找下一个锁,自旋锁是一种纯用户态的锁,因为是轻量级锁,所以消耗的资源少,不过长时间寻找锁也会导致CPU消耗,而且在寻找锁时是不能做其他任务的。

  • 速度快,可以第一时间拿到锁,消耗CPU资源(忙等)

挂起等待锁🔒:(重量级锁)在解锁后,挂起等待锁会自动放弃等待时机,相当于挂起等待锁不会去一直等待锁,而是需要锁时,而且锁是空闲状态,才会进行加锁,自旋锁是一种内核态的锁,因为是重量级锁,所以消耗的资源多。

  • 锁被释放,无法第一时间拿到锁,不消耗CPU资源

四,📍互斥锁 vs 读写锁

互斥锁🔒:进入锁加锁,出锁则解锁

读写锁🔒:锁如其名,对数据的读加锁,对数据的写加锁,然后再进行完操作后,解锁。

两把锁之间的约定读数据时无竞争,写数据存在竞争,读写数据也存在竞争

五,📍可重入锁 vs 不可重入锁

可重入锁🔒:一把锁,针对一个线程加锁两次,该线程满足不死锁的条件时,就叫做可重入锁。

不可重入锁🔒:只能加锁一次,如果对其再加锁会造成死锁(阻塞)。第一个锁释放的条件是要求第二个锁加锁,意识就是,a被锁了,要解开a,必须把a的外层进行加锁,不过这种现象几乎就是死锁了。

synchronized是一个可重入锁,在执行加锁操作时,会先判定是否会造成死锁,也就是对其线程判定一下是否在此之前已经加锁,如果已经加锁,会进行解锁,同一线程的加锁操作,直接‘放行’。

六,📍公平锁 vs 非公平锁

遵守先来先执行的锁是公平锁,反之就是非公平锁。

公平锁🔒:先来后到

非公平锁🔒:后来先到

在系统中对线程的调度是随机的,synchronized是一个非公平锁,如果需要实现一个公平锁,需要对锁中加入一个队列来记录加锁程序的顺序。

总结:synchronized可以是乐观锁,也可以是悲观锁,也可能是轻量级 (自旋锁),也可以是重量级(挂起等待锁),synchronized是一个可重入锁,synchronized是一个非公平锁


http://www.ppmy.cn/news/46324.html

相关文章

基因家族分析及SCI写作技巧

详情点击链接:基因家族分析及SCI写作技巧 一,文献研读和方法​ 1.基因家族分析文献; 2.基因组学分析技巧; 3.生物信息大数据分析二,基因家族注释文件​​​​​​​ 1.候选基因下载方式; 2.文件解读&a…

为什么老年人会经常性出现吃饭呛咳的情况 什么因素导致的

其实很多老年人在吃饭或是喝水的时候,都存在吞咽困难的问题,呛咳或者是忘了如何下咽。其实在老年人群体当中,这也是一种较为常见的现象,但是很多人都把这种现象当回事。 对于呛咳的现象是很好判断的,在家里老人喝水或是…

linux安装rabbitMq

一、安装Erlang 1、下载Erlang Erlang和RabbitMQ版本对照:RabbitMQ Erlang Version Requirements — RabbitMQ 下载地址:https://packagecloud.io/rabbitmq/erlang/packages/el/7 2、安装 Erlang 首先将下载好的文件上传到服务器,创建一…

Linux做代理服务器实现步骤

Linux做代理服务器 最简单的做法,用RedHat9.0为例 找一台能装上Linux的机器最少要有两块网卡 1.安装Linux,不管是在图形,还是文体下都可以,选择最小安装,在安装的时候可以先配置一下外网的IP和DNS(不设也行)&#xf…

GPT-3.5还没研究明白,GPT-4又来了,chatGPT会进化成什么样?

基于GPT-3.5的chatGPT热度才稍稍减退没多久,GPT-4又来了,文新一言的发布会也槽点满满,差距似乎越来越大了。 chatGPT到底厉害在哪?为什么突然就爆火了呢? 它的爆火,一方面,和它的出现形态有关…

LeetCode刷题集(二)(LeetCode 2037使每位学生都有座位的最少移动次数)

学习目标: 掌握LeetCode2037使每位学生都有座位的最少移动次数 题目内容: 一个房间里有 n 个座位和 n 名学生,房间用一个数轴表示。给你一个长度为 n 的数组 seats ,其中 seats[i] 是第 i 个座位的位置。同时给你一个长度为 n 的数…

在vue中如何使用nextTick ?nextTick 的原理是什么?

Vue.js 是一个流行的前端框架,它提供了一种响应式的数据绑定机制,使得页面的数据与页面的 UI 组件之间能够自动同步。Vue.js 中的数据驱动模型可以让开发者专注于业务逻辑,而不用过多地关注页面 DOM 操作的细节。然而,在某些情况下…

【hello Linux】进程概念(下)

目录 1. 通过系统调用创建进程—fork 1.1 通过fork创建进程: 1.2 如何不退出 vim 直接执行命令呢? 3. fork创建进程的本质 4. 父子进程的分流: 2. 进程状态 3. 信号 3.1 显示全部信号 3.1 停止进程 3.2 继续进程 3.3 杀死进程 后台进程 4. 僵…