synchrosized 的可重入特性、死锁、哲学家就餐问题以及解决死锁的方法等干货

文章目录

  • 💐synchrosized的可重入特性
  • 关于死锁:
  • 哲学家就餐问题
  • 💡如何避免/解决死锁

💐synchrosized的可重入特性

可重入特性:当一个线程针对一个对象同时加锁多次,不会构成死锁,这样的特性称为可重入性

例如下图:

在这里插入图片描述

为了防止上述死锁情况,synchrosized 就引入了可重入性解决;

线程在加锁时,在这个锁对象内部,它会记录是对哪个线程加了锁,当对同一个线程再次进行加锁时,就会判断该线程是不是同一个线程并且是否已经持有了锁,如果已经有了锁,那么也会重复进行加锁,不会导致死锁现象;

**那么,问题就来了,如果加两次锁,在 }2 的地方是否应该解锁呢?**答案:不能释放锁

在这里插入图片描述

如果加了n次锁呢?该怎么去释放呢?

答案:在锁对象中,不仅会记录对哪个线程加了锁,还会有一个计数器记录加锁的次数;如果对同一个线程加锁多次,那么每当执行完一个加锁的代码块时,计数器就会减1,一直到最后一个锁时,才会释放锁;

关于死锁:

  1. 在Java中,如果一个线程对同一个锁连续加锁两次,不会造成死锁现象

  2. 如果两个线程,两把锁,每个线程都嵌套的加两个不同的锁,就会造成死锁现象

例如:让线程1先获取 lock1,线程2获取 lock2,然后在 thread1 的内部再尝试获取 lock2,在 thread2 的内部再尝试获取 lock1

public static void main(String[] args) {//定义两把锁Object lock1 = new Object();Object lock2 = new Object();//让线程1嵌套获取两把锁Thread thread1 = new Thread(() -> {synchronized (lock1) {//此处睡眠很重要,如果没有睡眠,线程1可能就会一下子把两把锁都获取了,就构不成死锁现象了try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (lock2) {System.out.println("thread1加锁成功");}}});//让线程2嵌套获取两把锁Thread thread2 = new Thread(() -> {synchronized (lock2) {try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (lock1) {System.out.println("thread2加锁成功");}}});thread1.start();thread2.start();}

执行结果:
在这里插入图片描述

3. n个线程,m把锁,也容易出现死锁问题,例如哲学家就餐问题:

哲学家就餐问题

在这里插入图片描述

死锁 是一个比较严重的bug,那如何避免/解决死锁呢?

💡如何避免/解决死锁

要想避免死锁,就要先知道死锁是怎么形成的,这样才能对症下药,导致死锁的四个必要条件:

1.互斥使用:当线程1获取锁之后,线程2也想获取同一把锁,就会阻塞等待(锁的特性)

2.不可抢占:当线程1已经获取到锁之后,线程2不能强行抢占锁(锁的特性)

3.请求保持:一个线程尝试获取多把锁(一个线程获取到锁1之后,还想尝试获取锁2,此时锁1也并未解锁)例如上面的嵌套加锁代码

4.循环等待:线程获取锁时,形成了环路;例如,上面哲学家同时拿起左边的筷子

第一点和第二点是锁的特性,如果想要解决死锁,就要破坏第三点和第四点,

对于第三点来讲,只要避免两把不同的锁嵌套获取即可

在这里插入图片描述

对于第四点来讲,可以约定给所有的锁进行一个编号,规定所有的线程只能按顺序先获取编号小的锁,然后获取编号大的,例如:

在这里插入图片描述

在这里插入图片描述

以上虽然时嵌套加锁的,但是并未形成环路,得到lock1锁的线程执行,未获得lock1的线程阻塞等待,并且也无法获得lock2

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

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

相关文章

前端学习第一天-html基础

达标要求 网页的形成过程 常用的浏览器及常见的浏览器内核 web 标准三层组成 什么是HTML 熟练掌握HTML文档结构 熟练掌握HTML常用标签 1. 初识web前端 Web前端是创建Web页面或App等前端界面呈现给用户的过程。 Web前端开发是从网页制作演变而来,早期网站主…

sklearn.preprocessing.RobustScaler(解释和原理,分位数,四分位差)

提示:sklearn.preprocessing.RobustScaler(解释和原理,分位数,四分位差) 文章目录 [TOC](文章目录) 一、RobustScaler 是什么?二、代码1.代码2.输出结果 总结 提示:以下是本篇文章正文内容&…

ELK学习

ELK 一、ELK介绍 😄 “ELK”是三个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。Elasticsearch 是一个搜索和分析引擎。Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据&#xff0…

网络编程(IP、端口、协议、UDP、TCP)【详解】

目录 1.什么是网络编程? 2.基本的通信架构 3.网络通信三要素 4.UDP通信-快速入门 5.UDP通信-多发多收 6.TCP通信-快速入门 7.TCP通信-多发多收 8.TCP通信-同时接收多个客户端 9.TCP通信-综合案例 1.什么是网络编程? 网络编程是可以让设…

Redis的事务

在 Redis 中,事务(Transaction)是一组命令的集合,可以作为一个单独的操作来执行,保证这组命令要么全部执行成功,要么全部执行失败,具有原子性。在 Redis 中,事务是通过 MULTI、EXEC、…

repo介绍和安装

介绍 https://blog.devwiki.net/2023/11/27/Windows-repo.html 安装: https://blog.csdn.net/ysy950803/article/details/104188793

网络安全-appcms-master

一、环境 gethub上面自己找appcms-master 二、开始闯关 原理:在评论的时候提交可以提交到管理员列表去,管理员一看cookie和地址就被盗走了 点进去软件后会发现提交按钮 随便提交一下看看 放到div标签里面是不是有可能可以做,看看后台吧 那…

初学者如何学习python

Python 作为当今最受欢迎的编程语言之一,已经被包括谷歌、优步、Instagram 等知名公司广泛采用于他们的应用程序开发。由于其易学易用的特性,Python 成为了编程初学者的首选语言。特别是在机器学习和数据科学领域,Python 的应用更是让它成为了…

VUE CLI3项目搭建 ESLint配置

VUE项目框架配置 一、工具准备 Node.js安装 安装方法:点击查看WebStorm安装 下载地址:点击查看 二、环境准备 镜像准备 1.查看代理:npm get registry 2.设置淘宝镜像 2.1临时使用. npm --registry https://registry.npm.taobao.org ins…

【电机仿真】空间矢量脉宽调制(SVPWM)算法与实现

前言 文章【电机仿真】永磁同步电机模型中所提及了PMSM数学模型,模型算法是电机控制的理论基础,但在实际控制中,需要将这两部分具象化。实际电机所需要的总是三相电流或者电压,控制对象为逆变器中的开关器件,我们需要将…

springboot基于web的音乐网站论文

音乐网站 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了音乐网站的开发全过程。通过分析音乐网站管理的不足,创建了一个计算机管理音乐网站的方案。文章介绍了音乐网站的系统分析部分&#xff0c…

114.龙芯2k1000-pmon(13)- 串口如何用

本文是讲原理图的部分,跟pmon的关系不大!! 参考手册:《龙芯2K1000处理器用户手册.pdf》 刚刚看数据手册,让我是有点惊讶,但是也让我迷惑。(一个串口复用为4个是啥意思?)…

Java项目:32 基于springboot的课程作业管理系统(含源码数据库+文档免费送)

作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员:首页、个人中心、公告信息管理、班级管理、学生管理、教师管理、课程类型管理、课程信息管理、学生选课管理、作业布置管理…

CK98-数学家键盘配置

官方驱动和说明书下载地址 https://www.coolkiller.cn/download/lists_6.html 介绍:https://new.qq.com/rain/a/20221229A09B1M00 官方CK-98数学家驱动版本(谨慎更新) 如果升级驱动出现问题,重启驱动软件后会默认让你恢复的。 …

[蓝桥杯 2020 省 AB3] 日期识别

每日一道算法题之日期识别 一、题目描述二、思路三、C代码 一、题目描述 题目来源:洛谷 【蓝桥杯 2020 第三轮省赛 AB 组 F 题】小蓝要处理非常多的数据, 其中有一些数据是日期。 在小蓝处理的日期中有两种常用的形式:英文形式和数字形式。英文形式采用…

利用小蜜蜂AI智能问答ChatGPT+AI高清绘图生成图文故事案例

利用小蜜蜂AI智能问答ChatGPTAI高清绘图生成图文故事案例 这段时间利用小蜜蜂AI网站做了一些编程、绘图以及数据分析方面的案例。再过几个月,我的大孙子就要出生了。我要用小蜜蜂AI智能问答和AI高清绘图为大孙子生成一个1-9的数字图文故事。 小蜜蜂AI网站可以扫如…

程序项目打包发布方法,采用InstallShield软件

重点: 1.程序项目做出来了,需要打包发布给用户。如何打包是关键。 2.采用InstallShield软件进行发布。 步骤一:创建一个依赖三方库配置环境的bat文件的项目。 (主要测试三方库打包 和如果有bat文件,需要先创建环境&…

读书笔记-三国演义-曹操

魏武帝曹操(155年-220年),是中国东汉末年至三国时期的重要政治家、军事家和文学家,同时也是三国时期魏国的建立者。他以其雄才大略、果断机敏的领导才能以及卓越的军事才华而闻名于世。 生平 曹操出生于豫州谯县&…

C++STL排序原理简介

../chromedriver 一份简化的代码(可读性较强)一份简化的代码(可读性较强) 一份简化的代码(可读性较强) c 的sort用了很多年,一直不知道具体是怎么写的 决定看看代码,以下文章结构可能有点混乱,建议读者同时打开vs同步跳转 https://www.geeksf…

一文认识蓝牙(验证基于Aduino IDE的ESP32)

1、简介 蓝牙技术是一种无线通信的方式,利用特定频率的波段(2.4GHz-2.485GHz左右),进行电磁波传输,总共有83.5MHz的带宽资源。 1.1、背景 蓝牙(Bluetooth)一词取自于十世纪丹麦国王哈拉尔Haral…