猿问

请问我这个死锁写的有什么问题吗?

看得视频,跟着敲了一遍,是想写个死锁,但是能执行成功,麻烦帮看看为什么?

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

    public void run () {
        System.out.println("flag=" + flag);

        if (flag == 1) {
            synchronized (o1) {
                try {
                    Thread.sleep(5000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            synchronized (o2) {
                System.out.println(1);
            }
        }

        if (flag == 0) {
            synchronized (o2) {
                try {
                    Thread.sleep(5000);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                synchronized (o1) {
                    System.out.println(0);
                }
            }
        }
    }

    public static void main(String[] args) {
        TestDeadLock td1 = new TestDeadLock();
        TestDeadLock td2 = new TestDeadLock();

        td1.flag = 1;
        td2.flag = 0;

        Thread t1 = new Thread(td1);
        Thread t2 = new Thread(td2);

        t1.start();
        t2.start();
    }
}
智慧大石
浏览 410回答 1
1回答

慕神8447489

经过朋友指点,问题找到了 if (flag == 1) 这个逻辑里,o1与o2对象,没有产生依赖关系。 修改为后 public class TestDeadLock implements Runnable { public int flag = 1; static Object o1 = new Object(); static Object o2 = new Object(); public void run () { System.out.println("flag=" + flag); if (flag == 1) { synchronized (o1) { try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } synchronized (o2) { System.out.println(1); } } } if (flag == 0) { synchronized (o2) { try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } synchronized (o1) { System.out.println(0); } } } } public static void main(String[] args) { TestDeadLock td1 = new TestDeadLock(); TestDeadLock td2 = new TestDeadLock(); td1.flag = 1; td2.flag = 0; Thread t1 = new Thread(td1); Thread t2 = new Thread(td2); t1.start(); t2.start(); } }
随时随地看视频慕课网APP

相关分类

Java
我要回答