《死锁》与《CAS ABA》问题

news2024/9/21 1:32:33

文章目录

    • 什么是死锁
    • 常见死锁情况❗️
    • 死锁的必要条件❗️
    • 如何避免死锁呢?
    • CAS
    • CAS中ABA问题
    • 解决ABA问题

什么是死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象 。

常见死锁情况❗️

1.一个线程一把锁

//伪代码
synchronized(lock1){
	synchronized(lock1){
		...
	}
	...
}

我们以第一次加锁可以成功,当我们进行第二次加锁的时候就出现麻烦了,可以发现我们当前的锁对象已经被占用了,我们就会不断的去尝试加锁,此时就导致了死循环。

2、两个线程两把锁

//伪代码线程 t1
synchronized(lock1){
	synchronized(lock2){
		...
	}
}

//伪代码线程 t2
synchronized(lock2){
	synchronized(lock1){
		...
	}
}

假设有两个线程,线程t1和线程t2,当线程t1和t2同时开始执行,t1获取到了lock1锁对象,t2获取到lock2的锁对象,当t1去获取lock2时发现已经被占用,t2去获取lock1时发现也被占用,此时就发生了死锁。

3、N个线程M把锁

线程数量和锁的数量更多了,更容易死锁。

死锁的必要条件❗️

死锁的发生必须具备以下四个必要条件:
1.互斥使用:一个锁被一个线程占用后,其他线程使用不了(锁本质,保证原子性)。
2.不可抢占:一个锁被一个线程占用后,其他线程不能将锁抢占。
3.请求和保持:当一个线程占据多把锁后,除非显式释放锁,否则锁一直被该线程锁占用。
4.环路等待:多个线程等待关系闭环了,比如A等B,B等C,C等A

如何避免死锁呢?

死锁是一个比较严重的bug,实践中如何避免死锁呢?
一个简单的条件,破解循环等待~
针对锁进行编号,如果需要获取多把锁,约定加锁顺序,务必是先对小的编号加锁,后对编号大的枷锁。

//伪代码线程 t1
synchronized(lock1){
	synchronized(lock2){
		...
	}
}

//伪代码线程 t2
synchronized(lock1){
	synchronized(lock2){
		...
	}
}

CAS

CAS概念:CAS通过比较内存中的一个数据是否是预期值,如果是就将它修改成新值,如果不是则进行自旋(从新获取新值),重复比较的操作,直到某一刻内存值等于预期值再进行修改。

在这里插入图片描述
寄存器A的值如果比较内存M的值相等,那么就把寄存器B的值赋给M。CAS操作,是一条CPU指令,并非是一段代码!这一条指令能完成上述一段代码的的功能。

CAS中ABA问题

首先线程1进行读取共享变量A的值,由于种种原因线程挂起,在挂起时线程2执行把A的值改了,又改回来了,此后线程1挂起恢复,判断值一样(寄存器A和内存M),进行一系列操作,此时是会有bug的。
有些业务可能不需要关心中间过程,只要前后值一样就行,但是有些业务需求要求变量在中间过程不能被修改。

解决ABA问题

我们要想解决ABA问题我们需要引入版本号(当有修改操作版本号+1),此时再判断版本号相不相同,不相同则放弃此次CAS操作。

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

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

相关文章

Java-static那些事儿

static作为java中基础常用的关键字,通常用于修饰内部类,方法和变量和代码段,且具有以下特性: static修饰内部类时,该类属于静态内部类,其只能访问外部的静态变量和方法static修饰方法时,该方法…

ROS学习第三十七节——机器人运动控制以及里程计信息显示

https://download.csdn.net/download/qq_45685327/87719766 https://download.csdn.net/download/qq_45685327/87719873 gazebo 中已经可以正常显示机器人模型了,那么如何像在 rviz 中一样控制机器人运动呢?在此,需要涉及到ros中的组件: ros…

【mapbox+turf.js】WebGIS空间分析系列(1)

最近在想,自己一直使用webgis做的都是可视化的内容,缺少空间分析的功能。 所以吧,最近理一下使用mapbox turf来做一些基础的空间分析功能。 大概的思路是,获取目标图层(多个图层),然后选择空…

servlet(2)—javaEE

1.获取请求数据 1.1开发前端发请求 ajax封装代码 // 参数 args 是一个 JS 对象, 里面包含了以下属性 // method: 请求方法 // url: 请求路径 // body: 请求的正文数据 // contentType: 请求正文的格式 // callback: 处理响应的回调函数, 有两个参数, 响应正文和响应的状态码…

qt中使用 ui 文件进行界面设计

目录 1、创建 Qt 应用 ​2、项目创建成功 3、直接点击打开 mainwindow.ui 文件 4、随便从左边侧边栏拖拽一个空间到 界面设计区域 5、在右侧边栏右键点击 pushButton 控件,点击转到槽 6、根据实际需要选择对应的信号,我这里方便演示选择 clicked&a…

linux 信号量semget/semop/semctl

专栏内容:linux下并发编程个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 目录 前言 概述 原理机制 接口说明 代码演示 结尾 前言 本专栏主要分享linux下并发编…

基于 多态 的职工管理系统(Staff Management System)

目录 一、管理系统需求 作用:管理公司内所有员工的信息 分类:要显示每位员工的编号、姓名、岗位与职责 具体实现的功能: 二、创建管理 类 三、各个接口函数 1、菜单展示功能 2、 选择功能 3、创建员工功能 ①普通员工employee ②经理…

【Web3.0大势所趋】我看到了互联网未来的模样

前言 Web3.0 是一个越来越受到关注的话题,它被认为将会带来天翻地覆的变化。本文我们一起来谈谈 Web3.0 的概念、特点和优势,并探讨它为什么如此重要和具有革命性的。 文章目录 前言Web3.0是什么Web3.0的技术Web3.0的优势总结 Web3.0是什么 Web3.0: 是下…

尚硅谷Kafka

Kafka 1.Kafka概述1.1 定义1.2 消息队列1.2.1 传统消息队列的应用场景1.2.2 消息队列的两种模式 1.3 kafka基础架构 2.快速入门2.1 kafka环境安装2.2 kafka命令行操作参数2.2.1 主题命令行操作 2.2.2 生产者命令行操作2.2.3 消费者命令行操作 3.Kafka 生产者3.1 生产者消息发送…

Vue3+Vite神器:按需引入自定义组件unplugin-vue-components

前言 我们做项目时,会封装大量的公共组件,如果我们每一个都去在maints里面引入,非常麻烦不说,代码也不优雅。所以更好的方法就是自动注册全局组件,在组件中直接使用就好。 一种方法是自己在components文件夹下新建in…

QML控件--MenuBar

文章目录 一、控件基本信息二、控件使用三、属性成员四、成员函数 一、控件基本信息 Import Statement:import QtQuick.Controls 1.4 Since:Qt 5.1 二、控件使用 MenuBar:是菜单栏,通常,菜单静态声明为菜单栏的子项&…

redis入门必会知识

Redis基础知识目录 5、sortedSet 文章目录 系列文章目录前言一、pandas是什么?二、使用步骤 1.引入库2.读入数据总结 前言 一、redis是什么? Redis(Remote Dictionary Server ),即远程字典服务 ! 是一个开源的使用ANSI C语言编写…

【C++】——- 模板初阶介绍

前言: 在之前的学习中,我们已经把 C前期所需要用到的知识都给大家介绍了一遍。接下来,我们要学习的就是关于在C 中模板的基本知识,今天我带给大家的内容便是关于 模板初阶的介绍。 目录 (一) 泛型编程 &…

【Python_Opencv图像处理框架】图像形态学操作

写在前面 本篇文章是opencv学习的第三篇文章,主要讲解了图像的形态学有关操作,作为初学者,我尽己所能,但仍会存在疏漏的地方,希望各位看官不吝指正❤️ 写在中间 读完这篇文章后,相信您便能信手拈来下面图…

给照片换底色(python+opencv)

给照片换底色(pythonopencv) 本篇目录: 🦄 一、分析照片基本信息 🦄 二、方法一(遍历图像,将像素值点替换修改为指定颜色) 🦄 三、修改图片颜色方法二(先转…

MySQL数据库索引

目录 0.知识回顾 1.数据库约束 一.索引 1.什么是索引 2.为什么要使用索引(作用) 3.索引的使用场景 4.如何使用索引 1.查看索引 2.创建索引 3.修改索引 4.删除索引 5.索引的分类 1.使用场景不同 2.按列区分 3.按数据组织方式 二.索引的数据结构 1.HASH 2.二叉搜…

如何设计自动化测试框架?阿里P7工程师耗时一个月总结而成

目录 一、什么是自动化测试框架 二、自动化测试框架的架构设计 三、自动化测试框架的最佳实践 四、自动化测试框架的组成部分 五、自动化测试框架的设计原则 六、如何选择自动化测试框架 七、自动化测试框架实例 八、结论 一、什么是自动化测试框架 自动化测试框架是一…

UE4/5多人游戏详解(八、游戏模式和游戏状态里的函数重写,插件内地图的地址做变量,做变量让按钮出现不同状态,插件内的所有代码)

目录 这里不写在插件里面,而是在游戏模式: 头文件: Cpp文件: 更改ini文件 进入地图设置模式: 写插件里面,做一个变量: 写变量 然后更改函数MenuSet: 在子系统中做变量&…

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(四)

接着同样地我们也需要完成对千兆网口ETH模块和USB2.0模块的编写,实际上和UART串口模块的设计思想大同小异,也同样地需要完成两项关键功能即识别并解析报文、接收并发送数据,千兆网口ETH和USB2.0的底层驱动在前面的例程中也详细说明了&#xf…

常用的设计模式(单例模式、工厂模式等)

1.单例模式 概述: 在有些系统中,为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是所谓的单例模式. 例如,Windows 中只能打开一个任务管理器,这样可以避免因打开多个任务管理器窗口而造…