java模拟死锁

本文探讨了Java中死锁的概念,解释了当两个或更多进程因资源竞争和通信导致无法继续执行的情况。举例说明了一个线程先锁定A再锁定B,而另一线程则相反,导致双方都在等待对方释放锁,从而形成死锁。代码示例展示了这种死锁状态,虚拟机检测到1个死锁并停滞不前。

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

死锁:指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。例如:假如有一个线程,在它执行的过程中。他首先需要锁定A,然后再需要锁定B,再锁定A的过程中还需要锁定B,另一个线程需要先锁定B,然后再需要锁定A,再锁定B的过程中还需要锁定A,整个线程才能完成。这时第一个线程把A锁拿了,第二个线程把B锁拿了,这时候第一个线程想去抢夺B锁,而此时第二个线程想去抢夺A锁,此时两个线程都执行不下去了就出现了死锁。
如下代码所示:

package chapter8;

/**
 * @Author
 * @Date 2019/7/23 20:24
 **/
public class DeadLockTest01 {
    private final static Object lock1 = new Object();
    private final static Object lock2 = new Object();
    private static void m1(){
        synchronized (lock1){
            m11();
        }
    }
    private static void m11(){
        synchronized (lock2){
            System.out.println("调用m11");
        }
    }
    private static void m2(){
        synchronized (lock2){
            m22();
        }
    }
    private static void m22(){
        synchronized (lock1){
            System.out.println("调用m22");
        }
    }


    public static void main(String[] args) {
        new Thread(()->{
            while (true)
            m1();
        }).start();

        new Thread(()->{
            while (true)
            m2();
        }).start();
    }
}

结果:
在这里插入图片描述
此时虚拟机迟迟不会停止。
在这里插入图片描述
查看可知,此时Found 1 deadlock.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值