Java learn 死锁

死锁产生原因
项目代码比较繁琐,多线程应用里有可能会发生死锁

死锁在数据库里的解释更为清晰全面 且难度也是很大 概念难懂

以下是错误的死锁范例:

 class fileguy {
	public static void main(String[] args) {
		players P1=new players("sd",3,3);
		players P2=new players("sd1",2,3);
		
		Thread t1=new Thread()
				{
			public void run()
			{
			try
			{
				
				synchronized(P1)
				{
					System.out.println("占用P1");
				}//也就是这里执行完毕就已经释放P1了
				Thread.sleep(1000);
				System.out.println("试图占用P2");
				
			}catch(InterruptedException e)
			{
			e.printStackTrace();	
			}
			System.out.println("t1 等待中 。。。。");
			synchronized (P2) {
				System.out.println("do it?");
			}//而P2还未被占用 所以会执行其中的语句
			}
				};
				t1.start();
				
				Thread t2=new Thread()
				{
			public void run()
			{
			try
			{
				
				synchronized(P2)
				{
					System.out.println("占用P2");
				}//也就是这里执行完毕就已经释放P2了
				Thread.sleep(1000);
				System.out.println("试图占用P1");
				
			}catch(InterruptedException e)
			{
			e.printStackTrace();	
			}
			System.out.println("t2 等待中 。。。。");
			synchronized (P1) {
				System.out.println("do it also?");
			}//在那一刻P1已经被释放 所以可以执行其中的语句
			}
				};
				t2.start();
		
		
}
}

在这里插入图片描述
以上并没用发生死锁只是看起来发生了…

以下是正确的死锁案例:

 class fileguy {
	public static void main(String[] args) {
		players P1=new players("sd",3,3);
		players P2=new players("sd1",2,3);
		
		Thread t1=new Thread()
{
			public void run()
			{
				synchronized(P1)
				{
					System.out.println("占用P1");
				
			     try
			   {
				  Thread.sleep(1000);
				  System.out.println("试图占用P2");
				
			    }catch(InterruptedException e)
			    {
			     e.printStackTrace();	
			     }
			     System.out.println("t1 等待中 。。。。");
			   synchronized (P2) {
				  System.out.println("do it?");
			    }
			 }
	}
};
				t1.start();
				
				Thread t2=new Thread()
				{
			public void run()
			{
				synchronized(P2)
				{
					System.out.println("占用P2");
				
			try
			{
				Thread.sleep(1000);
				System.out.println("试图占用P1");
				
			}catch(InterruptedException e)
			{
			e.printStackTrace();	
			}
			System.out.println("t2 等待中 。。。。");
			synchronized (P1) {
				System.out.println("do it also?");
			}
				}
			}
				};
				t2.start();
		
		
}
}

在这里插入图片描述

  1. 线程1 首先占有对象P1,接着试图占有对象P2
  2. 线程2 首先占有对象P2,接着试图占有对象P1
  3. 线程1 等待线程2释放对象P2
  4. 与此同时,线程2等待线程1释放对象P1
  5. 就这样 两个互相等着 等到…

勘误:
对于synchronized 块语句 所包含的代码段为占用该对象后要执行的功能直到执行完毕 才会释放该对象(对于synchronized有个更全面的认识) 所以产生死锁由代码段来看 是一个synchronized块语句占用了该对象在其中又包含了占用其他对象的synchronized块语句 这是synchronized语句的嵌套 写法允许可是问题就出现在两个线程类实例同时进行synchronized块语句嵌套 试图占用对方的对象 进而发生死锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值