Java 死锁

本文通过一个具体的代码示例,深入解析Java中死锁的发生原因。演示了两个线程如何因相互等待对方持有的锁而陷入死锁状态,强调了在多线程编程中正确使用锁的重要性。

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

Java 死锁

死锁代码Demo


    private void testDeadLock() {
        final Object lockA = new Object();
        final Object lockB = new Object();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lockA) {
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (lockB) {
                        Log.i("qinxue", "thread1 ");
                    }
                }
            }
        });

        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lockB) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    synchronized (lockA) {
                        Log.i("qinxue", "thread2");
                    }
                }
            }
        });
        thread1.start();
        thread2.start();
    }

分析

线程1:获取lockA,500ms后获取lockB才能继续执行打印"thread1"代码。
线程2:获取lockB,1000ms后获取lockA才能继续执行打印"thread2"代码。
死锁:

线程1需要获取lockB
线程2需要释放 lockB
线程1需要释放LokA

总结

显示中的死锁多为一些异常情况没有释放锁(死循环),或者使用java多线程锁不当引起,应该避免手写多线程编程,多使用JDK并发包中的并发容器和工具类来解决并发问题,因为这些类都已经通过了充分的测试和优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值