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锁,输出语句。两个线程都在等待释放资源,并且该资源被另外一个线程锁定,导致每个线程都在等待对象线程释放其锁,从而产生死锁现象。

猜你喜欢

转载自blog.csdn.net/m0_46988935/article/details/112896652