当前位置: 首页 > news >正文

总结多线程的各种锁

1、公平锁和非公平锁

        公平锁是严格按照线程请求的顺序来分配锁,每一个线程都能获取到锁,避免线程饥饿现象;相反,非公平锁表示线程竞争锁时可以插队来抢占资源。

        非公平锁在大多数情况下效率优于公平锁,因为公平锁涉及到线程状态的切换,这是一笔很大的开销;

        举例:当我们使用非公平锁时,如果线程A释放锁之后,本来应该唤醒队列中的线程B,此时却被没有进入到阻塞队列的线程C截胡了,线程C竞争到锁之后就直接执行业务逻辑,就不需要再进入到阻塞队列了,这样就省去了后续再唤醒线程C而带来的性能开销,当然,这对于原本需要唤醒的线程B是不公平的,但是却提升了锁竞争的性能。

        synchronized和ReentrantLock默认都是非公平的,ReentrantLock可以设置为公平锁,synchronized不能。

2、乐观锁和悲观锁

        乐观锁表示线程在更新数据时,认为不会有其它线程对数据进行修改,因此不需要加锁,但是在更新时会判断此期间有没有被别的线程修改过数据。具体实现:JUC包下的原子类的实现,就是使用乐观锁+CAS实现的。

        悲观锁在更新数据时,认为其它线程会更新数据,因此会加锁,别的线程想要修改数据,就必须获取锁,获取不到锁就被阻塞。具体实现:synchronized和ReentrantLock这种独占锁都是悲观锁的具体实现。

3、死锁

        两个线程互相获取对方已经拥有的资源而形成的对峙局面,成为死锁。在没有外部条件的干涉下,程序无法向下执行,一直阻塞。

        破局:得不到就放弃。设置获取锁的次数,超过该次数还没拿到锁,就放弃当前已经有用的资源,从而打破死锁。

4、活锁

        活锁出现在两个线程互相改变对方的结束条件,最后谁也无法结束。就跟你去银行取钱,你的银行卡密码一直在变,永远别想取到钱。

5、可重入锁

        线程在抢占到一个互斥锁资源后,在释放锁之前,再去竞争同一把锁时,无需等待,只需要记录重入的次数。

        常见的可重入锁,synchronized和ReentrantLock。

        可重入锁主要为了避免死锁。线程获取到X锁,在释放之前再次获取X锁,那就是自己和自己竞争,如果不可重入,那就会出现死锁。

6、共享锁和独占锁

        共享锁是指锁可以被多个线程所持有,数据加上共享锁之后,其他线程也只能加共享锁。

        共享锁只能读取数据,不能修改数据。

        独占锁是一次只能有一个线程持有锁,加上独占锁之后,其他线程无法对数加锁。

        独占锁可以修改数据,也可以读取数据。

        具体实现:ReentrantReadWriteLock称为读写锁,里边有两把锁,一把读锁,一把写锁;读锁是共享锁,写锁是独占锁,两者不能同时存在。

        因为独占锁是一种过于严格的加规则,限制了并发。避免了写/写冲突,读/写冲突,但是也避免掉了读/读冲突。在大多数情况下都是读的场景,因此使用共享锁就可以提升性能。ReentrantReadWriteLock适用于读多写少的场景。

7、读写锁

        读写锁管理一组锁,一个是读锁,一个是写锁。

        读锁在没有写锁的情况下可以被多个线程共享;相反,写锁只能独占。

        写锁的优先级高于读锁。

8、互斥锁

         互斥锁是独占锁的一种具体实现,指某一个资源在同一时刻只能被一个线程访问,具有唯一性排他性。       

9、自旋锁

        线程没有获取到锁时,不是被直接挂起,而是执行一个忙循环,这个忙循环就是自旋。自选的目的是为了减小线程被挂起的概率,因为线程的挂起和唤醒也都是耗费资源的。

        一个特殊的情况是另一个线程占用所得时间很长,导致当前线程自旋时间也很长,之后线程还是会被挂起,那么这个自选操作就是读对系统资源的浪费,反而降低系统性能。

        具体实现:AtomicInteger原子类的getAndAddInt()方法,一个do-while循环,不断获取当前值Value,然后重试,循环退出条件为CAS返回true。

        优化:JDK1.6引入了自适应自旋,根据获取当前锁的上一个线程的自旋时间以及锁的拥有者的状态决定。如果虚拟机认为会成功,就多点自旋时间;如果认为会失败,那可能会将线程直接挂起,避免自选。

相关文章:

总结多线程的各种锁

1、公平锁和非公平锁 公平锁是严格按照线程请求的顺序来分配锁,每一个线程都能获取到锁,避免线程饥饿现象;相反,非公平锁表示线程竞争锁时可以插队来抢占资源。 非公平锁在大多数情况下效率优于公平锁,因为公平锁涉及到…...

树形结构的窗口小部件

这段代码是一个使用Qt框架的C程序,实现了一个树形结构的窗口小部件(TreeWidget)。以下是主要的解释: #include "treewidget.h" #include "ui_treewidget.h"TreeWidget::TreeWidget(QWidget *parent) : QWidg…...

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》 写在最前面私钥加密与伪随机性 第一部分密码学的计算方法论计算安全加密的定义:对称加密算法 伪随机性伪随机生成器(PRG) 规约法规约证明 构造安全…...

Redis底层原理

持久化 Redis虽然是个内存数据库,但是Redis支持RDB和AOF两种持久化机制,将数据写往磁盘,可以有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。 RDB RDB持久化是把当前进程数据生成快照保存到硬盘的过程。所谓内存快照,就是…...

掌握亚马逊、Lazada、shopee、速卖通、eBay、wish测评自养号补单系统:解锁跨境电商新机遇

在选择测评环境系统时,市面上有很多选项。但是,究竟哪个系统使用起来更高效、成本更低、成功率更高呢?下面将详细分析各种网络环境的使用经验,希望能帮助大家避免一些不必要的困扰和错误。我曾经亲自尝试过各种网络环境&#xff0…...

15_多线程

文章目录 OS中的基本概念进程(process)与线程(thread)串行(serial)、并行(parallel)与并发(concurrency)同步(synchronization)与异步(asynchronization) java程序运行原理java命令主类类名运行原理 多线程的实现方式一&#xff1…...

吉他打谱软件Guitar Pro8苹果Mac电脑简体中文特别版

Guitar Pro 8 Mac是一款吉他编曲学习软件,用于吉他、贝和其他弦乐器的制谱和演奏,这是一个多轨编辑器,具有集成的 MIDI 编辑器、合唱绘图仪、吉他、节拍器和其他音乐家工具。它使您能够编辑吉他、贝司和尤克里里、乐谱、指法谱,并…...

go study oneday

这段代码的详细解释,涵盖了Go 语言变量声明、函数调用、用户输入、类型转换以及结果输出。 package main import "fmt" func main() {var num1 intvar num2 float32var num3 intfmt.Println("请输入数字一:")fmt.Scanln(&num1)f…...

Avatar虚拟数字人方案,元宇宙时代的企业新动力

随着元宇宙概念的兴起,虚拟数字人技术逐渐成为各行业关注的焦点。为了满足市场需求,美摄科技凭借专业、自研的虚拟数字人技术,结合强大的ChatGPT能力,隆重推出Avatar虚拟数字人方案,助力企业实现营销及内容创作的生产力…...

用golang 实现给图片添加文字水印

package mainimport ("fmt""github.com/golang/freetype""image""image/draw""image/jpeg""io""os""time" )func main() {// 打开原始图片file, err : os.Open("004.jpeg")if err …...

苹果电脑Markdown文本编辑Typora mac功能介绍

Typora mac是一款跨平台的Markdown编辑器,支持Windows、MacOS和Linux操作系统。它具有实时预览功能,能够自动将Markdown文本转换为漂亮的排版效果,让用户专注于写作内容而不必关心格式调整。Typora Mac版除了支持常见的Markdown语法外&#x…...

大型语言模型与知识图谱的完美结合:从LLMs到RAG,探索知识图谱构建的全新篇章

最近,使用大型语言模型(LLMs)和知识图谱(KG)开发 RAG(Retrieval Augmented Generation)流程引起了很大的关注。在这篇文章中,我将使用 LlamaIndex 和 NebulaGraph 来构建一个关于费城费利斯队(Philadelphia Phillies)的 RAG 流程。 我们用的是开源的 NebulaGraph 来…...

Vue 缓存Hook:提高接口性能,减少重复请求

前言 在开发 Web 应用时,我们经常会遇到需要重复调用接口的场景。例如,当用户频繁刷新页面或进行某个操作时,我们可能需要多次请求相同的数据。这不仅会增加服务器负担,还会导致用户体验下降。为此,我们可以使用缓存机…...

【Python机器学习】用于回归的决策树

用于回归的决策树与用于分类的决策树类似,在DecisionTreeRegressor中实现。DecisionTreeRegressor不能外推,也不能在训练数据范围之外的数据进行预测。 利用计算机内存历史及格的数据进行实验,数据展示: import pandas as pd im…...

numpy库的一些常用函数

文章目录 广播(broadcast)迭代数组数组运算修改数组的形状 修改数组维度连接数组分割数组数组元素的添加与删除Numpy算术函数Numpy 统计函数Numpy排序、条件筛选函数条件筛选 import numpy as np anp.arange(15).reshape(3,5)aarray([[ 0, 1, 2, 3, …...

成员变量与局部变量的区别?

如果你现在需要准备面试,可以关注我的公众号:”Tom聊架构“,回复暗号:”578“,领取一份我整理的50W字面试宝典,可以帮助你提高80%的面试通过率,价值很高!! 语法形式&…...

ES6---判断对象是否为{}

介绍 使用es6语法判断一个对象是否为{} 示例 使用ES6的Object.keys()方法,返回值是对象中属性名组成的数组 let obj {}let keys Object.keys(obj) if(keys.length){alert(对象不为{}) }else{alert(对象为{}) }代码地址 https://gitee.com/u.uu.com/js-test/b…...

高性能、可扩展、分布式对象存储系统MinIO的介绍、部署步骤以及代码示例

详细介绍 MinIO 是一款流行的开源对象存储系统,设计上兼容 Amazon S3 API,主要用于私有云和边缘计算场景。它提供了高性能、高可用性以及易于管理的对象存储服务。以下是 MinIO 的详细介绍及优缺点: 架构与特性: 开源与跨平台&am…...

oracle重启数据库lsnrctl重启监听

oracle重启数据库lsnrctl重启监听 su到oracle用户下,命令 su - oracle切换需要启动的数据库实例: export ORACLE_SIDorcl进入Sqlplus控制台,命令: sqlplus /nolog以系统管理员登录,命令: connect / as sysdba如果是…...

08、Kafka ------ 消息存储相关的配置-->消息过期时间设置、查看主题下的消息存活时间等配置

目录 消息存储相关的配置★ 消息的存储介绍★ 消息过期时间及处理方式演示:log.cleanup.policy 属性配置 ★ 修改指定主题的消息保存时间演示:将 test2 主题下的消息的保存时间设为10个小时1、先查看test2主题下的配置2、然后设置消息的保存时间3、然后再…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM&#xff09…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

云原生安全实战:API网关Envoy的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口&#xff0c;负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...

开疆智能Ethernet/IP转Modbus网关连接鸣志步进电机驱动器配置案例

在工业自动化控制系统中&#xff0c;常常会遇到不同品牌和通信协议的设备需要协同工作的情况。本案例中&#xff0c;客户现场采用了 罗克韦尔PLC&#xff0c;但需要控制的变频器仅支持 ModbusRTU 协议。为了实现PLC 对变频器的有效控制与监控&#xff0c;引入了开疆智能Etherne…...

篇章一 论坛系统——前置知识

目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构​编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...

循环语句之while

While语句包括一个循环条件和一段代码块&#xff0c;只要条件为真&#xff0c;就不断 循环执行代码块。 1 2 3 while (条件) { 语句 ; } var i 0; while (i < 100) {console.log(i 当前为&#xff1a; i); i i 1; } 下面的例子是一个无限循环&#xff0c;因…...