JAVA多线程死锁现象示例展示

本文通过一个简单的示例展示了死锁现象。死锁发生在两个或多个线程互相等待对方持有的资源时,导致所有线程都无法继续执行。示例中定义了两个锁(locka和lockb),并创建了两个线程分别尝试获取这两个锁。当每个线程已经获得一个锁之后再尝试获取另一个锁时,如果另一个锁已经被其他线程持有,则会发生死锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

* 死锁简单示例

* 死锁的原因是由于 两个线程相互等待 对方已被锁定的资源

形象比喻:死锁
    |-- 多个线程,你抢我的锁,我抢你的锁
    |-- 你中有我,我中有你
    |-- 同步的嵌套
    举例 A 线程 B线程
    A持有A锁,然后,运行,A持有了B锁
    B持有B锁,运行,B持有A锁

下面示例展示:

/*
  死锁实例
*/


class Dead implements Runnable
{
private boolean b = false;
Dead(boolean b)
{
 this.b = b;
}
public void run()
{
 while(true)
 {
    if(b)
  {
     synchronized(Locks.locka)
  {//0线程,进来后,只有了A锁,打印了if,CPU走了
    System.out.println(Thread.currentThread().getName()+"  locka...+.. if");


synchronized(Locks.lockb)
  {
  System.out.println(Thread.currentThread().getName()+"  lockb...+.. if");
  }
  }
  }
  else
  {
     synchronized(Locks.lockb)
  {
//1线程就进来了,持有了B锁,打印了else
  System.out.println(Thread.currentThread().getName()+"  lockb...+.. else");
            synchronized(Locks.locka)
  {
System.out.println(Thread.currentThread().getName()+"  locka...+.. else");


  }
  }
  }
 }
}
}
//创造锁
class Locks
{
public static Object locka = new Object();
public static Object lockb = new Object();
}
class DeadLock 
{
public static void main(String[] args) 
{
Dead d1 = new Dead(true);
Dead d2 = new Dead(false);
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t2.start();


}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值