1. Java中导致死锁的原因

Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2永远被阻塞了。导致了死锁。这是最容易理解也是最简单的死锁的形式。但是实际环境中的死锁往往比这个复杂的多。可能会有多个线程形成了一个死锁的环路,比如:线程T1持有锁L1并且申请获得锁L2,而线程T2持有锁L2并且申请获得锁L3,而线程T3持有锁L3并且申请获得锁L1,这样导致了一个锁依赖的环路:T1依赖T2的锁L2,T2依赖T3的锁L3,而T3依赖T1的锁L1。从而导致了死锁。

从这两个例子,我们可以得出结论,产生死锁可能性的最根本原因是:线程在获得一个锁L1的情况下再去申请另外一个锁L2,也就是锁L1想要包含了锁L2,也就是说在获得了锁L1,并且没有释放锁L1的情况下,又去申请获得锁L2,这个是产生死锁的最根本原因。另一个原因是默认的锁申请操作是阻塞的

public class DeadLock{private static final Integer a=10;private static final Integer b=20;public void getA(){synchronized (a){try{Thread.sleep(10l);}catch (InterruptedException e){e.printStackTrace();}synchronized (b){System.out.println("Thread is "+Thread.currentThread().getName()+" "+", a is "+a);}}}public void getB(){synchronized (Integer.valueOf(b)){try{Thread.sleep(10l);}catch (InterruptedException e){e.printStackTrace();}synchronized (Integer.valueOf(a)){System.out.println("Thread is "+Thread.currentThread().getName()+", b is "+b);}}}}

测试:

DeadLock deadLock=new DeadLock();for(int i=0;i<50;i++){Thread thread=new Thread(new Runnable() {@Overridepublic void run() {deadLock.getA();}});thread.start();Thread thread1=new Thread(new Runnable() {@Overridepublic void run() {deadLock.getB();}});thread1.start();}

结果不会打印任何东西,产生了死锁。

转载于:https://www.cnblogs.com/BonnieWss/p/10511496.html

java多线程--死锁相关推荐

  1. java多线程死锁代码_java多线程死锁 编写高质量代码:改善Java程序的151个建议...

    java多线程死锁 编写高质量代码:改善Java程序的151个建议 第1章 Java开发中的通用方法和准则 建议1:不要在常量和变量中出现易混淆的字母 建议2:莫让常量蜕变成变量 建议3:三元操作符的 ...

  2. Java多线程死锁例子

    目录 一.产生死锁的原因 二.如何避免死锁 一.产生死锁的原因 发生死锁的情况: 多个线程需要同时占用多个共享资源而发生需要互相死循环等待的情况,就是,两个线程互相等待着对象释放锁,一直这样僵持下去, ...

  3. Java 多线程 —— 死锁与锁的错误用法

    引言 死锁状态的大致情况是:Thread_1在获得A对象的锁后,紧接着去请求B对象的锁 ,Thread_2在获得了B对象的锁后,紧接着又去请求A对象的锁,如下图: 一.模拟一个死锁 public cl ...

  4. JAVA多线程死锁模拟

    多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放,而该资源又被其他线程锁定,从而导致每一个线程都得等其它线程释放其锁定的资源,造成了所有线程都无法正常结束.这是从网上其他文档看到的死锁产 ...

  5. 深耕Java多线程 - 死锁、活锁、饥饿

    文章目录 1. 什么是死锁? 2. 死锁产生的四个必要条件是什么? 3. 如何定位死锁? 3.1 jps+jstack 3.2 jconsole 4. 如何避免死锁? 5. 活锁 6. 饥饿 1. 什 ...

  6. java多线程-死锁的一些问题

    **死锁:**不同的线程相互占用对方的资源不放弃并等待对方放弃自己需要的资源,形成了僵局,从而陷入阻塞状态 必要条件 如果在一个系统中以下四个条件同时成立,那么就能引起死锁: 互斥:至少有一个资源必须 ...

  7. Java——多线程(死锁)

    死锁是指:两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为 ...

  8. Java多线程--死锁例子

    package qzy.thread.deadLock;/*** @描述模拟死锁** 形成死锁的四个必要条件是什么** 1.互斥条件:线程(进程)对于所分配到的资源具有排它性,即一个资源只能被一个线程 ...

  9. java 线程死锁简单例子_java 多线程死锁详解及简单实例

    java 多线程死锁 相信有过多线程编程经验的朋友,都吃过死锁的苦.除非你不使用多线程,否则死锁的可能性会一直存在.为什么会出现死锁呢?我想原因主要有下面几个方面: (1)个人使用锁的经验差异 (2) ...

最新文章

  1. 筑算高程点提取插件_「教程」原来利用高程数据点建立地形模型,只需要一个键...
  2. 理论计算机初步:概率算法和近似算法
  3. linux安全配置-将ssh服务隐藏于Internet(端口碰撞)
  4. C++中,有哪4种与类型转换相关的关键字?各有什么特点?应该在什么场合下使用?
  5. 【转】自然语言系列学习之表示学习与知识获取(五)融合文本和知识,利用cnn方法进行关系抽取
  6. Java 学习之反射机制“解刨”分解类,并获取内容!
  7. 技术圈的女性工程师都去哪呢?
  8. 【Vegas原创】VMWare下,Linux挂载、卸载新硬盘的方法
  9. Hyperledger Fabric教程(10)-- peer命令-链码chaincode
  10. [转]小D课堂 - 零基础入门SpringBoot2.X到实战_汇总
  11. PS2手柄通讯协议解析---附资料和源码
  12. 咦,我发现了微信的一个秘密
  13. select去重 sqlserver_SQLSERVER 去重
  14. 2022-2028全球与中国工业蜂窝网关市场现状及未来发展趋势
  15. win10安装红警运行出现FATALString Manager failed to initilaized properly
  16. Laravel PDF 导出
  17. 环境问题还是测试的老大难?
  18. 在西雅图华盛顿大学 (University of Washington) 就读是怎样一番体验?
  19. 手把手教您使用北美打折返利网
  20. 【Pandas】日期抽取.dt.weekday与.weekday()

热门文章

  1. iPhone开发中现文件的增加 删除和查询
  2. 磁盘空间神秘消失事件
  3. 安全框架 - Shiro与springMVC整合的注解以及JSP标签
  4. javascript 字符串
  5. Spring.NET学习笔记9——打造简易的依赖注入框架(练习篇) Level 100
  6. CakePHP中文手册【翻译】-请求处理组件
  7. android luajava,android嵌入lua
  8. java注解方式实体类_如何用注解的方式在实体类中实现一对一,和一对多多对多...
  9. Python编辑器与集成开发环境(IDE)选择
  10. 信纳比(SINAD)介绍