程序不会导致死锁

时间:2015-07-15 05:12:45

标签: java

我正在尝试在此程序中实现死锁条件 这个程序没有给出死锁条件。为什么? 请告诉我这段代码有什么问题。

输出结果为:

  

Thread1:锁定整数
  Thread2:锁定字符串
  Thread1:锁定字符串
  Thread2:锁定整数

代码:

 class Dead {
    public void meth1() {
        synchronized (Integer.class) {
            System.out.println("Thread 1: locked Integer");
        }
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            System.out.println(e);
        }
        synchronized (String.class) {
            System.out.println("Thread 1: locked String");
        }
    }

    public void meth2() {
        synchronized (String.class) {
            System.out.println("Thread 2: locked String");
        }
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            System.out.println(e);
        }
        synchronized (Integer.class) {
            System.out.println("Thread 2: locked Integer");

        }
    }

}

class MThread1 extends Thread {
    Dead d;

    MThread1(Dead d) {
        this.d = d;
    }

    public void run() {
        d.meth1();
    }

}

class MThread2 extends Thread {

    Dead d;

    MThread2(Dead d) {
        this.d = d;
    }

    public void run() {
        d.meth2();
    }

}

public class Thread1 {
    public static void main(String[] args) {
        // Dead d = new Dead();
        MThread1 t1 = new MThread1(new Dead());
        MThread2 t2 = new MThread2(new Dead());
        t1.start();
        t2.start();
    }
}

2 个答案:

答案 0 :(得分:2)

写作时

synchronized (Integer.class) {
            System.out.println("Thread 1: locked Integer");
        }

它锁定Integer.class对象并立即解锁它。你想要这个:

synchronized(Integer.class) {
    System.out.println("Thread 1: locked Integer");
    try {
        Thread.sleep(5000);
    } catch(InterruptedException e) {
        System.out.println(e);
    }
    synchronized(String.class) {
        System.out.println("Thread 1: locked String");
    }
}

答案 1 :(得分:1)

为什么你会期望它变成僵局?请尝试以下代码:

//in method meth1
synchronized(Integer.class) {
     //blah blah
     synchronized(String.class) {
          //blah blah
     }
}

//in method meth2
synchronized(String.class) {
     //blah blah
     synchronized(Integer.class) {
          //blah blah
     }
}

请参阅此处获取锁定的方式,如果您尝试多次运行,您将看到死锁。

在你的情况下,你只是获得一个类对象的锁定(而其他方法等待它)并从一个方法释放锁定而其他方法接受它,因此没有死锁。

meth1锁定Integer.class并等待锁定String.classmeth2将锁定String.class并等待等待Integer.class时,会发生死锁锁定meth1所持有的$accepted = $currentUser->potentialFriendsOfMine()->where('helper_id', $input);