Java线程100%死锁demo



当线程中的同步代码有多个嵌套同步锁时容易发生死锁,下面的例子中3个线程公用3把锁,每个线程必须拿到2把才能继续运行,运行结束才能释放锁,由于3个线程一启动便分别占用了3把锁,都不能拿到第2把锁,又释放不掉已经拿到的锁,因此发生死锁现象:

public class F {
 
    public static void main(String[] args) {
        Lock r1 = new Lock("-同步锁1-");
        Lock r2 = new Lock("-同步锁2-");
        Lock r3 = new Lock("-同步锁3-");
  
        MyThread mt1 = new MyThread(r1, r2, "-线程1-");
        MyThread mt2 = new MyThread(r2, r3, "-线程2-");
        MyThread mt3 = new MyThread(r3, r1, "-线程3-");
  
        mt1.start();
        mt2.start();
        mt3.start();
    }
}

class Lock {
    String name;
    public Lock(String name) {
        this.name = name;
    }
}

class MyThread extends Thread{
    String name;
    Lock r1,r2;
 
 
    public MyThread(Lock r1, Lock r2, String name) {

        this.r1 = r1;
        this.r2 = r2;
        this.name = name;
    }
 
    public void run() {
        synchronized (r1) {
            System.out.println(name + "获得" + r1.name);
            System.out.println(name + "等待" + r2.name + "...");
            synchronized (r2) {
                System.out.println(name + "获得" + r2.name);
            }
        }
    }
}

运行结果:

-线程3-获得-同步锁3-
-线程2-获得-同步锁2-
-线程1-获得-同步锁1-
-线程1-等待-同步锁2-...
-线程2-等待-同步锁3-...
-线程3-等待-同步锁1-...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值