Java中死锁产生的原因及解决方法
一、什么是死锁
死锁就是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的现象,若无外力作用,他们都无法推进下去。
简单来说就是A和B若同时都有一个资源,在此之外还想拥有对方的资源,由于资源如果在某个人手里,其他人就无法获得,所以变成了你不让我,我不让你,就僵持下了。
下面我们来看下具体代码:
public class CreateDeadThread {public static void main(String[] args) throws InterruptedException {Object lock1=new Object();Object lock2=new Object();Thread thread1=new Thread(()->{synchronized (lock1){System.out.println("A获取到了锁A");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock2){System.out.println("A获取到了锁B");}}});thread1.start();Thread thread2=new Thread(()->{synchronized (lock2){System.out.println("B获取到了锁B");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock1){System.out.println("B获取到了锁A");}}});thread2.start();thread1.join();thread2.join();}
}
我们可以使用jdk自带的工具查看死锁(jvisualvm/jmc/jconsole),这个一般在你jdk安装目录下的bin目录下,我的就在D:\Program Files\Java\jdk1.8.0_131\bin
二、死锁产生的原因
- 互斥条件:一个资源只能被一个线程占有,当这个资源被占有后其他线程就只能等待
- 不可剥夺条件:当一个线程不主动释放资源时,此资源一直被拥有线程占有
- 请求并持有条件:线程已经拥有了一个资源后,又尝试请求新的资源
- 环路等待条件:产生死锁一定是发生了线程资源环形链
三、解决方法
知道原因后,我们只需要改变线程的环路访问就可以解决:
public class SaveDeadThread {public static void main(String[] args) throws InterruptedException {Object lock1=new Object();Object lock2=new Object();Thread thread1=new Thread(()->{synchronized (lock1){System.out.println("A获取到了锁A");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock2){System.out.println("A获取到了锁B");}}});thread1.start();Thread thread2=new Thread(()->{synchronized (lock1){System.out.println("B获取到了锁B");try {TimeUnit.SECONDS.sleep(3);} catch (InterruptedException e) {e.printStackTrace();}synchronized (lock2){System.out.println("B获取到了锁A");}}});thread2.start();thread1.join();thread2.join();}
}
Java中死锁产生的原因及解决方法相关推荐
- 出现 java.lang.UnsupportedClassVersionError 错误的原因及解决方法
1 错误描述 正常运行程序,报出如下错误: 2 错误原因 通过观察上述标记出来的错误描述,咱们可以知道: java.lang.UnsupportedClassVersionError:Unsuppor ...
- java 转换gbk编码,java中GBK转UTF-8乱码的解决方法
java中GBK转UTF-8乱码的解决方法 如果自己采用的是GBK编码,对方采用得到是UTF-8编码,发送数据时需要将GBK编码数据转换成UTF-8编码数据,这样对方才不会乱码. 问题出现:GBK转U ...
- 死锁产生的原因以及解决方法
死锁产生的原因以及解决方法 参考文章: (1)死锁产生的原因以及解决方法 (2)https://www.cnblogs.com/JimmyFanHome/p/9914562.html 备忘一下.
- 基于继承类的属性模版中无法绑定的原因和解决方法
原文:基于继承类的属性模版中无法绑定的原因和解决方法 这个的晚上想学学WPF 做一个类似于ERP 左边菜单.构思一下思路 ...... 创建一个类基于Expander类. 1 public class ...
- SpringBoot 中@Autowired 注入失效原因及解决方法
SpringBoot 中@Autowired 注入失效原因及解决方法 1.原因分析 1.1 包没有被扫描到通过@Autowired注入的类所在的包路径不在Application启动类所在的包/子包路径 ...
- python import变灰_pycharm中import呈现灰色原因的解决方法
1. 问题描述: 同目录下,当多个文件之间有相互依赖的关系的时候,import无法识别自己写的模块,PyCharm中提示No Module. 2. 解决步骤: (1). 打开File--> Se ...
- MySQL死锁产生的原因和解决方法
前言 最近老顾经常碰到同事说,mysql又死锁了导致业务报错.今天我们就来聊聊死锁以及怎么解决 锁类型 mysql锁级别:页级.表级.行级 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突 ...
- java中的方法求和_在Java中模拟求和类型的巧妙解决方法
java中的方法求和 在继续阅读实际文章之前,我想感谢令人敬畏的Javaslang库的作者Daniel Dietrich ,他在我面前有了这个主意: @lukaseder尝试使用静态方法<T,T ...
- 在Java中模拟求和类型的巧妙解决方法
在继续阅读实际文章之前,我想感谢令人敬畏的Javaslang库的作者Daniel Dietrich ,他在我面前有了这个主意: @lukaseder尝试使用静态方法<T,T1扩展T,... Tn ...
最新文章
- psnr 与 ssim评测步骤
- html5控件组合,[Vue 3] 教程 – 可复用与组合 – 插件
- *LeetCode--Add Two Numbers
- Android 11 限制反射,如何破解?
- LeetCode 27.移除元素 思考分析
- embedding亦福亦祸?XGBoost与LightGBM的新机遇
- Python+OpenCV图像处理之模糊操作
- 鸿蒙OS最快6月正式推送;微信Windows版将支持刷朋友圈;GCC 11.1正式发布|极客头条...
- 【NOIP2001】【Luogu1029】最大公约数和最小公倍数问题(GCD,枚举)
- vscode选择python解释器
- 灵活好用,GIF 屏幕录制工具
- k3s 快速入门 - traefix 使用 - 1
- Centos 7环境MySql8.0.28源码安装
- SRE(运维工程师)一文详解技术体系和架构师成长之路
- 2022 极术通讯-安谋科技参与起草的PSA相关物联网终端安全标准介绍(电信终端产业协会发布)
- 常用快递API(顺丰、EMS、申通、圆通等)及快递在线下单API分享
- 计算机病毒通常隐藏在 中 2分,计算机考试题
- 斐波拉契数列 Java三种实现
- zabbix系列:解决zabbix模板不能重复链接到其它模板, 即使透过其它模板
- 万由nas系统安装MySQL_蜗牛星际矿机折腾记1-安装万由U-NAS OS
热门文章
- python的元类与类继承的区别
- python中的浮点数类型
- 坐地铁飞机数秒进站,关于3D人脸识别闸机你知道的有多少?
- python脚本写ui自动化_如何用Airtest编写UI自动化脚本
- window升级版本
- 16/8/23-jQuery完全图解scrollLeft,scrollWidth,clientWidth,offsetWidth 获取相对途径,滚动图片...
- mPEG-AAN-NHS 甲氧基聚乙二醇-AAN-N-羟基琥珀酰亚胺 mPEG5K-AAN-NHS
- php curl开源中国,使用php curl登陆开源中国
- atoi函数功能以及模拟实现
- python项目代码审计_Python 安全 -代码审计