Java死锁代码实例及产生死锁必备的四个条件

 更新时间:2024年01月16日 09:50:39   作者:加油当当  
这篇文章主要介绍了Java死锁代码实例及产生死锁必备的四个条件,Java 发生死锁的根本原因是,在申请锁时发生了交叉闭环申请,synchronized在开发中最好不要嵌套使用,容易导致死锁,需要的朋友可以参考下

Java死锁

  • Java 发生死锁的根本原因是:在申请锁时发生了交叉闭环申请;
  • 据说面试喜欢考;
  • synchronized在开发中最好不要嵌套使用,容易导致死锁;
public class DeadLock {
		public static void main(String[] args) {
			Object o1 = new Object();
			Object o2 = new Object();
			// t1和t2两个线程共享o1,o2
			Thread t1 = new MyThread1(o1,o2);
			Thread t2 = new MyThread2(o1,o2);
			t1.start();
			t2.start();
		}
	}
	class MyThread1 extends Thread{
		Object o1;
		Object o2;
		public MyThread1(Object o1,Object o2){
			this.o1 = o1;
			this.o2 = o2;
		}
		public void run(){
			synchronized (o1){
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (o2){
				}
			}
		}
	}
	class MyThread2 extends Thread {
		Object o1;
		Object o2;
		public MyThread2(Object o1,Object o2){
			this.o1 = o1;
			this.o2 = o2;
		}
		public void run(){
			synchronized (o2){
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				synchronized (o1){
				}
			}
		}
}

产生死锁必须具备以下四个条件:【必会】

  • 互斥条件:该资源任意一个时刻只由一个线程占用;
  • 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放;
  • 不剥夺条件:线程已获得的资源在未使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源;
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系;(比如一个进程集合,A在等B,B在等C,C在等A);

到此这篇关于Java死锁代码实例及产生死锁必备的四个条件的文章就介绍到这了,更多相关Java死锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何设计一个安全的API接口详解

    如何设计一个安全的API接口详解

    在日常开发中,总会接触到各种接口,前后端数据传输接口,第三方业务平台接口,下面这篇文章主要给大家介绍了关于如何设计一个安全的API接口的相关资料,需要的朋友可以参考下
    2021-08-08
  • java用扑克牌计算24点

    java用扑克牌计算24点

    这篇文章主要为大家详细介绍了java实现24点扑克牌游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 聊聊Java BigInteger里面的mod和remainder的区别

    聊聊Java BigInteger里面的mod和remainder的区别

    这篇文章主要介绍了聊聊Java BigInteger里面的mod和remainder的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • maven搭建java ee项目图文教程

    maven搭建java ee项目图文教程

    这篇文章主要为大家详细介绍了maven搭建java ee项目图文教程,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • SpringCloudGateway网关处拦截并修改请求的操作方法

    SpringCloudGateway网关处拦截并修改请求的操作方法

    这篇文章主要介绍了SpringCloudGateway网关处拦截并修改请求的操作方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • 使用JAVA判断凸多边形的示例代码

    使用JAVA判断凸多边形的示例代码

    本文提供了使用JAVA判断凸多边形的示例代码供大家参考学习,需要的朋友可以看一下
    2013-11-11
  • 简单讲解java中throws与throw的区别

    简单讲解java中throws与throw的区别

    这篇文章主要介绍了简单讲解java中throws与throw的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java中synchronized关键字引出的多种锁 问题

    Java中synchronized关键字引出的多种锁 问题

    synchronized关键字是JAVA中常用的同步功能,提供了简单易用的锁功能。这篇文章主要介绍了Java中synchronized关键字引出的多种锁问题,需要的朋友可以参考下
    2019-07-07
  • 详解如何在springcloud分布式系统中实现分布式锁

    详解如何在springcloud分布式系统中实现分布式锁

    最近在看分布式锁的资料,本文就介绍一下利用springcloud结合redis实现分布式锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • springboot内置的tomcat支持最大的并发量问题

    springboot内置的tomcat支持最大的并发量问题

    这篇文章主要介绍了springboot内置的tomcat支持最大的并发量问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03

最新评论