一、什么是死锁

死锁就是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的现象,若无外力作用,他们都无法推进下去。

简单来说就是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

二、死锁产生的原因

  1. 互斥条件:一个资源只能被一个线程占有,当这个资源被占有后其他线程就只能等待
  2. 不可剥夺条件:当一个线程不主动释放资源时,此资源一直被拥有线程占有
  3. 请求并持有条件:线程已经拥有了一个资源后,又尝试请求新的资源
  4. 环路等待条件:产生死锁一定是发生了线程资源环形链

三、解决方法

知道原因后,我们只需要改变线程的环路访问就可以解决:

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中死锁产生的原因及解决方法相关推荐

  1. 出现 java.lang.UnsupportedClassVersionError 错误的原因及解决方法

    1 错误描述 正常运行程序,报出如下错误: 2 错误原因 通过观察上述标记出来的错误描述,咱们可以知道: java.lang.UnsupportedClassVersionError:Unsuppor ...

  2. java 转换gbk编码,java中GBK转UTF-8乱码的解决方法

    java中GBK转UTF-8乱码的解决方法 如果自己采用的是GBK编码,对方采用得到是UTF-8编码,发送数据时需要将GBK编码数据转换成UTF-8编码数据,这样对方才不会乱码. 问题出现:GBK转U ...

  3. 死锁产生的原因以及解决方法

    死锁产生的原因以及解决方法 参考文章: (1)死锁产生的原因以及解决方法 (2)https://www.cnblogs.com/JimmyFanHome/p/9914562.html 备忘一下.

  4. 基于继承类的属性模版中无法绑定的原因和解决方法

    原文:基于继承类的属性模版中无法绑定的原因和解决方法 这个的晚上想学学WPF 做一个类似于ERP 左边菜单.构思一下思路 ...... 创建一个类基于Expander类. 1 public class ...

  5. SpringBoot 中@Autowired 注入失效原因及解决方法

    SpringBoot 中@Autowired 注入失效原因及解决方法 1.原因分析 1.1 包没有被扫描到通过@Autowired注入的类所在的包路径不在Application启动类所在的包/子包路径 ...

  6. python import变灰_pycharm中import呈现灰色原因的解决方法

    1. 问题描述: 同目录下,当多个文件之间有相互依赖的关系的时候,import无法识别自己写的模块,PyCharm中提示No Module. 2. 解决步骤: (1). 打开File--> Se ...

  7. MySQL死锁产生的原因和解决方法

    前言 最近老顾经常碰到同事说,mysql又死锁了导致业务报错.今天我们就来聊聊死锁以及怎么解决 锁类型 mysql锁级别:页级.表级.行级 表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突 ...

  8. java中的方法求和_在Java中模拟求和类型的巧妙解决方法

    java中的方法求和 在继续阅读实际文章之前,我想感谢令人敬畏的Javaslang库的作者Daniel Dietrich ,他在我面前有了这个主意: @lukaseder尝试使用静态方法<T,T ...

  9. 在Java中模拟求和类型的巧妙解决方法

    在继续阅读实际文章之前,我想感谢令人敬畏的Javaslang库的作者Daniel Dietrich ,他在我面前有了这个主意: @lukaseder尝试使用静态方法<T,T1扩展T,... Tn ...

最新文章

  1. psnr 与 ssim评测步骤
  2. html5控件组合,[Vue 3] 教程 – 可复用与组合 – 插件
  3. *LeetCode--Add Two Numbers
  4. Android 11 限制反射,如何破解?
  5. LeetCode 27.移除元素 思考分析
  6. embedding亦福亦祸?XGBoost与LightGBM的新机遇
  7. Python+OpenCV图像处理之模糊操作
  8. 鸿蒙OS最快6月正式推送;微信Windows版将支持刷朋友圈;GCC 11.1正式发布|极客头条...
  9. 【NOIP2001】【Luogu1029】最大公约数和最小公倍数问题(GCD,枚举)
  10. vscode选择python解释器
  11. 灵活好用,GIF 屏幕录制工具
  12. k3s 快速入门 - traefix 使用 - 1
  13. Centos 7环境MySql8.0.28源码安装
  14. SRE(运维工程师)一文详解技术体系和架构师成长之路
  15. 2022 极术通讯-安谋科技参与起草的PSA相关物联网终端安全标准介绍(电信终端产业协会发布)
  16. 常用快递API(顺丰、EMS、申通、圆通等)及快递在线下单API分享
  17. 计算机病毒通常隐藏在 中 2分,计算机考试题
  18. 斐波拉契数列 Java三种实现
  19. zabbix系列:解决zabbix模板不能重复链接到其它模板, 即使透过其它模板
  20. 万由nas系统安装MySQL_蜗牛星际矿机折腾记1-安装万由U-NAS OS

热门文章

  1. python的元类与类继承的区别
  2. python中的浮点数类型
  3. 坐地铁飞机数秒进站,关于3D人脸识别闸机你知道的有多少?
  4. python脚本写ui自动化_如何用Airtest编写UI自动化脚本
  5. window升级版本
  6. 16/8/23-jQuery完全图解scrollLeft,scrollWidth,clientWidth,offsetWidth 获取相对途径,滚动图片...
  7. mPEG-AAN-NHS 甲氧基聚乙二醇-AAN-N-羟基琥珀酰亚胺 mPEG5K-AAN-NHS
  8. php curl开源中国,使用php curl登陆开源中国
  9. atoi函数功能以及模拟实现
  10. python项目代码审计_Python 安全 -代码审计