为什么这个死锁问题删除static就造不成死锁?

题目描述

这段代码是可以执行的,但是我删除static Object o1 = new Object(), o2 = new Object();前面的static,死锁问题就没了,求解答?

相关代码

public class TestDeadLock implements Runnable {
    int flag = 1;
    static Object o1 = new Object(), o2 = new Object();

    public static void main(String[] args) {
        TestDeadLock tdl1 = new TestDeadLock();
        TestDeadLock tdl2 = new TestDeadLock();
        tdl1.flag = 0;
        tdl2.flag = 1;
        Thread t1 = new Thread(tdl1);
        Thread t2 = new Thread(tdl2);
        t1.start();
        t2.start();
    }

    @Override
    public void run() {
        System.out.println("flag:" + flag);
        if (flag == 0) {
            synchronized (o1) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    // TODO: handle exception
                }
                synchronized (o2) {
                    System.out.println("0");
                }
            }
        }
        if (flag == 1) {
            synchronized (o2) {
                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    // TODO: handle exception
                }
                synchronized (o1) {
                    System.out.println("1");
                }
            }
        }
        
    }
}
慕后森
浏览 390回答 2
2回答

绝地无双

因为在你使用static修饰以后o1 o2两个实例是静态实例,(在类被加载的时候就已经创建),不管你创建多少个TestDeadLock对象,他们都是同一个,所以不同的TestDeadLock实力访问的时候会造成锁等待,从而导致死锁的产生。但是如果去除static这里的o1和o2只是成员属性,所以当你new不同的TestDeadLock对象的时候,他们其实是不同的对象,互相之间根本不受到影响(虽然代码层面看起来都是o1 o2,但实际程序运行的时候tdl1的o1 o2,和tdl2的o1 o2是不一样的,完全无关)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java