线程安全问题之死锁

在这里插入图片描述

作者简介: zoro-1,目前大二,正在学习Java,数据结构,javaee等
作者主页: zoro-1的主页
欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

线程安全问题之死锁

  • 一个线程,一把锁
  • 两个线程,两把锁
  • M个线程,M把锁
  • 陷入死锁的四个必要条件
  • 解决死锁的方案

一个线程,一把锁

public class ThreadText6 {
    public static void main(String[] args) {
        Object object=new Object();
        Thread thread=new Thread(()->{
            synchronized (object){//(A)
                synchronized (object){//(B)
                    System.out.println(1);
                }//(C)
            }//(D)
        });
        thread.start();
    }
}

在这个代码中,直观来看会产生锁冲突,最外层获取锁内层获取到锁时会产生阻塞,因为外层的锁还未释放,但JAVA中的synchronized锁是一个可重入锁(当线程已经持有锁时,它可以再次获取同一个锁,而不会被阻塞。这种锁可以在同一线程中被多次获取和释放,而不会出现死锁的情况,因为它会记录当前线程已经获取锁的计数器),第一次加锁时(A处),计数器加1,第二次加锁(B处)是同一个对象就直接计数器+1然后(C处)计数器减1,然后(D处)计数器归零,真正释放锁;

两个线程,两把锁

public class ThreadText7 {
    public static void main(String[] args) {
        Object A = new Object();
        Object B = new Object();
        Thread thread = new Thread(() -> {
            synchronized (A) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized (B) {
                    System.out.println("thread拿到两把锁");
                }
            }
        });
        Thread thread1 = new Thread(() -> {
            synchronized (B) {
                synchronized (A) {
                    System.out.println("thread1拿到两把锁");
                }
            }
        });
        thread.start();
        thread1.start();
    }
}

线程thread获取到A锁,然后休眠1000ms(确保thread1能获取到B锁),然后随机调度,可能thread尝试获取到B锁,也可能thread1尝试获取A锁但两个线程都获取不到,因为互相都没释放锁,就陷入永久的阻塞状态

M个线程,M把锁

一个经典的案例(哲学家就餐问题
在这里插入图片描述

我们把每个小人看作一个线程,每根筷子看作一把锁,每个线程都要完成吃面条这个任务(拿起两个筷子),但现在有一个特殊情况,我们让所有小人同时拿起左手旁的筷子,然后再尝试获取右边的筷子,就获取不到了因为每个小人都持有一根筷子,且在未获取到第二个筷子前不会释放锁,就陷入永久的阻塞了

陷入死锁的四个必要条件

1.互斥作用:一个线程获取到锁了,另一个线程想要获取到这个锁就要等到他释放
2.不可抢占性:一个线程获取到锁后只能主动释放不会被别的线程抢走
3.请求保持:一个线程在有一个锁的情况下,尝试获取其他的锁
4.循环等待/环路等待

解决死锁的方案

就M个线程,M把锁来说有:
1.额外加入筷子
2.去掉一个线程
3.引入计数器,限制最多多少人同时吃面
4.引入加锁顺序规则,将锁编好号,按从小到大加锁,只能拿左右手编号小的锁(最常用的一种)
用四方法解决两个线程,两把锁的问题就是(规定只能两个线程都只能先拿A,再拿B):

public class ThreadText7 {
    public static void main(String[] args) {
        Object A = new Object();
        Object B = new Object();
        Thread thread = new Thread(() -> {
            synchronized (A) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                synchronized (B) {
                    System.out.println("thread拿到两把锁");
                }
            }
        });
        Thread thread1 = new Thread(() -> {
            synchronized (A) {
                synchronized (B) {
                    System.out.println("thread1拿到两把锁");
                }
            }
        });
        thread.start();
        thread1.start();
    }
}
               >今天的分享到这就结束了,感谢大家支持

在这里插入图片描述

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

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

相关文章

基于减法平均优化器优化算法(SABO)-极限学习机(ELM)的时间序列预测模型matlab代码

极限学习机(Extreme Learning Machine, ELM)或“超限学习机”是一类基于前馈神经网络(Feedforward Neuron Network, FNN)构建的机器学习系统或方法,适用于监督学习和非监督学习问题。ELM在研究中被视为一类特殊的FNN&a…

亚马逊云科技 re:Invent 2023:科技前沿风向标,探索未来云计算之窗

文章目录 一、前言二、什么是亚马逊云科技 re:Invent?三、亚马逊云科技 re:Invent 2023 将于何时何地举行四、亚马逊云科技 re:Invent 2023 有什么内容?4.1 亚马逊云科技 re:Invent 2023 主题演讲4.2 亚马逊云科技行业专家探实战 五、更多亚马逊云科技活…

C++11【下】

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻 新的类功能类成员变量初始…

基于算能的AI边缘计算盒子,内置强悍TPU | 32TOPS INT8算力

边缘计算盒子 内置强悍TPU | 32TOPS INT8算力 ● 支持浮点运算的TPU平台盒子,支持32TOPSINT8,16TFLOPSFP16,2TFLOPSFP32高算力 ● 单芯片最高支持32路H.264 & H.265的实时解码能力 ● 支持国产算法框架Paddle飞桨,适配Caf…

Linux--初识和基本的指令(3)

目录 1.前言 1.指令 1.1 cat指令 1.2 echo指令 1.3 more 指令 1.4 less指令 1.5 什么时候使用less和more 1.6 head指令 1.7 tail指令 1.8 wc指令 1.9 与时间相关的指令 1.9.1 date指令 1.9.2 cal指令 1.10 16.find指令:(灰常重要&#x…

Python学习路线 - Python语言基础入门 - 准备工作

Python学习路线 - Python语言基础入门 - 准备工作 初识PythonPython的优点 什么是编程语言Python环境安装Windows系统Python安装Python验证 MacOS系统Linux系统 第一个Python程序常见问题 Python解释器Python解释器概念Python解释器存放位置Python解释器运行".py"文件…

Android File Transfer for Mac:畅享强大的安卓文件传输工具

作为一款功能强大的安卓文件传输工具,Android File Transfer for Mac(以下简称AFT)为Mac用户提供了便捷快速的安卓设备文件管理体验。无论是传输照片、音乐、视频还是文档,AFT都能满足你的需求,让你的文件传输更加高效…

ffmpeg 查看本地摄像头和麦克风设备名称

命令 ffmpeg -list_devices true -f dshow -i dummy 2

【代码】基于多能互补的电热联供型微网优化运行(完美复现)matlab+yalmip+cplex

MATLAB代码:基于多能互补的电热联供型微网优化运行,电热需求响应参与的综合能源微网协同优化调度,引入电热储能解耦电热联系,破解以热定电 关键词:热电联供型微网;热电解耦;综合能源需求响应&a…

读书笔记:《Effective Modern C++(C++14)》

Effective Modern C(C14) GitHub - CnTransGroup/EffectiveModernCppChinese: 《Effective Modern C》- 完成翻译 Deducing Types 模版类型推导: 引用,const,volatile被忽略数组名和函数名退化为指针通用引用&#…

关于安科瑞预付费系统在转供电情况下的应用-安科瑞 蒋静

1 前言 国家从2018年开始对转供电加价开展规范清理以来,已经出来了一系列政策,不仅包括专门针对转供电问题的政策,18-20年间还在每次降电价政策中突出强调了转供电主体不得截留降价红利的要求。从具体内容看,各地政策都鼓励一户一…

rtmp 协议详解

1. handshake 1.1 概述 rtmp 连接从握手开始。它包含三个固定大小的块。客户端发送的三个块命名为 C0,C1,C2;服务端发送的三个块命名为 S0,S1,S2。 握手序列: 客户端通过发送 C0 和 C1 消息来启动握手过程。客户端必须接收到 S1 消息,然后…

05-建造者模式-C语言实现

UML类图&#xff1a; 代码实现&#xff1a; #include <stdio.h> #include <stdlib.h>// 产品类 typedef struct {char* part1;char* part2;char* part3; } Product;// 抽象建造者类 typedef struct {void (*buildPart1)(void*, const char*);void (*buildPart2)(v…

8.4 Windows驱动开发:文件微过滤驱动入门

MiniFilter 微过滤驱动是相对于SFilter传统过滤驱动而言的&#xff0c;传统文件过滤驱动相对来说较为复杂&#xff0c;且接口不清晰并不符合快速开发的需求&#xff0c;为了解决复杂的开发问题&#xff0c;微过滤驱动就此诞生&#xff0c;微过滤驱动在编写时更简单&#xff0c;…

固定Microsoft Edge浏览器的位置设置,避免自动回调至中国

问题描述 在使用Copilot等功能时&#xff0c;需要将Microsoft Edge浏览器的位置设置为国外。但每次重新打开浏览器后&#xff0c;位置设置又自动回调至中国&#xff0c;导致每次均需要手动调整。 原因分析 这个问题的出现是因为每次启动Microsoft Edge时&#xff0c;默认打开…

VT-MRPA1-151-1X/V0/0控制2FRE16模块式模拟放大器

适用于控制带有电气位置反馈的直动式比例减压阀&#xff08;DBETR- 1X 类型&#xff09;或带有电气位置反馈的比例流量控制阀&#xff08;2FRE... 类型&#xff09;&#xff1b;控制值输入 1 0 V&#xff08;差动输入&#xff09;&#xff1b; 可分别调节“上/下”斜坡时间的斜…

RCE绕过

1.[SCTF 2021]rceme 总结下获取disabled_funciton的方式 1.phpinfo() 2.var_dump(ini_get(“disable_functions”)); 3.var_dump(get_cfg_var(“disable_functions”)); 其他的 var_dump(get_cfg_var(“open_basedir”)); var_dump(ini_get_all()); <?php if(isset($_POS…

MMdetection3.0 问题:DETR验证集上AP值全为0.0000

MMdetection3.0 问题&#xff1a;DETR验证集上AP值全为0.0000 条件&#xff1a; 1、选择的是NWPU-VHR-10数据集&#xff0c;其中训练集455张&#xff0c;验证、测试相同均为195张。 2、在Faster-rcnn、YOLOv3模型上均能训练成功&#xff0c;但是在DETR训练时&#xff0c;出现验…

分享89个节日PPT,总有一款适合您

分享89个节日PPT&#xff0c;总有一款适合您 89个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1j6Yj-7UCcUyV4V_S_eGjpQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

【计算机毕业设计】java网上服装商城销售系统springboot+jsp

目前互联网上的网上销售系统每天以惊人的速度增加&#xff0c;网上购物越来越成为现代年轻人的首选&#xff0c;足不出门便能选购好自己称心如意的商品。基于Java术及MySQL数据库设计与实现一个网上服装销售系统&#xff0c;要求实现用户管理、服装管理、新闻公告管理、留言管理…