请解释死锁概念

时间:2012-04-17 13:34:45

标签: java deadlock

我正在经历Java线程,特别是死锁概念,我在下面的代码中找到了这个:

public static void main(String... a) {

    final String o1 = "Lock ";
    final String o2 = "Step ";

    Thread th1 = new Thread() {
        public void run() {
            while (true) {
                synchronized (o1) {
                    synchronized (o2) {
                        System.out.println(o1 + o2);
                    }
                }
            }
        }

    };

    Thread th2 = new Thread() {
        public void run() {
            while (true) {
                synchronized (o2) {
                    synchronized (o1) {
                        System.out.println(o2 + o1);
                    }
                }
            }
        }

    };

    new Thread(th1).start();
    new Thread(th2).start();

}

请根据我的理解解释程序正在做什么,一个线程已经锁定并试图获取另一个锁定,而其他线程完成同样的操作,最后当我们启动时,两个线程都被卡住,有没有其他方法来创建上述程序的死锁,请提供建议以及上述代码中的锁定是实例级锁定。

3 个答案:

答案 0 :(得分:2)

考虑以下情况:

  • th1锁定o1并在有机会锁定o2之前被中断;
  • th2锁定o2并尝试锁定o1

两个帖子都没有进一步的进展,你有一个deadlock

您的代码的原始版本(在编辑之前)不可能出现死锁,因为两个线程以相同的顺序获取了两个锁(o1然后o2)。

答案 1 :(得分:0)

要创建死锁,您需要创建一个多线程正在等待其他线程持有的锁的情况。例如:

  • 线程1需要Lock1和Lock2
  • 按顺序请求:Lock1,Lock2
  • 线程2需要Lock1和Lock2
  • 按顺序请求:Lock2,Lock1

    1. 线程1请求Lock1。
    2. 线程2请求Lock2。
    3. 线程1获取Lock1。
    4. 线程2获取Lock2。
    5. 线程1请求Lock2。
    6. 线程2请求Lock1。
    7. 线程1不能有Lock2,线程2持有它。 /线程1等待......
    8. 线程2不能有Lock1,线程1持有它。 /线程2等待......

在你的(未经编辑的第一个)示例中,两个线程以相同的顺序请求所需的锁,这非常重要。如果Thread1获得Lock1,则Thread2无法获取Lock2并创建死锁,因为它仍在等待Lock1。避免死锁,因为两个线程都试图以相同的顺序获取锁。

在您的(新的,编辑过的)示例中,死锁可能如上所述发生。

答案 2 :(得分:0)

根据您编辑的帖子,th1可以获得o1而th2可以获得o2。然后两个线程都在等待另一个线程释放他们尚未获得的锁定,并且它永远不会发生==>死锁。