Java中多线程的死锁现象及演示一个死锁案例


前言

Java多线程中死锁是一个重要内容,所以对于死锁的理解非常重要。在面试过程中,经常会让程序员写一个死锁案例。

一、什么是死锁

  • 我们举一个生活中的例子,中国人和外国人一起吃饭,中国人使用筷子外国人使用叉子才能顺利吃完饭。
  • 那么什么是死锁现象呢?就是外国人拿着筷子,中国人拿着叉子,两个人谁都不给谁,那么,就会一直僵持,谁都吃不了饭。
  • 死锁现象出现后,不会出现异常,也不会出现提示,只是所有的线程都会出现阻塞状态,无法继续。

二、死锁案例

  1. 创建一个LockUtils接口
public interface LockUtils {
    Object Obj1 = new Object();
    Object Obj2 = new Object();
}

  1. 主程序
public class 死锁现象 implements LockUtils {
    public static void main(String[] args) {
        MyThread10 th1 = new MyThread10(true);
        MyThread10 th2 = new MyThread10(false);
        th1.start();
        th2.start();

    }

}
class  MyThread10 extends Thread {
    private boolean flag;

    public MyThread10(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        if (flag) {
        //同步代码块嵌套
            synchronized (LockUtils.Obj1) {
                System.out.println("true线程持有obj1锁,进来了");
                synchronized (LockUtils.Obj2) {
                    System.out.println("true线程持有obj2锁,进来了");
                }
            }

        } else {
            synchronized (LockUtils.Obj2) {
                System.out.println("false线程持有obj2锁,进来了");
                synchronized (LockUtils.Obj1) {
                    System.out.println("false线程持有obj1锁,进来了");
                }

            }

        }
    }
}

运行结果:
在这里插入图片描述
true线程拿了obj1锁,输出语句。false线程拿了obj2锁,输出语句。两个线程都在等待释放资源,并且该资源被另外一个线程锁定,导致每个线程都在等待对象线程释放其锁,从而产生死锁现象。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值