首页 > 解决方案 > 在这个例子中如何检查死锁

问题描述

目前我正在学习死锁,我发现了一个死锁的例子,但我不明白这个例子中死锁是如何发生的。

public class Main {

    public static void main(String[] args) {
        final PolitePerson jane = new PolitePerson("Jane");
        final PolitePerson john = new PolitePerson("John");

        new Thread(new Runnable() {
            @Override
            public void run() {
                 jane.sayHello(john);
            }
        }).start();

       new Thread(new Runnable() {
            @Override
            public void run() {
                john.sayHello(jane);
            }
        }).start();
    }

    static class PolitePerson {
        private final String name;

        public PolitePerson(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }

        public synchronized void sayHello(PolitePerson person){
            System.out.format("%s: %s" + " has said hello to me!%n", this.name, person.getName());

            person.sayHelloBack(this);
        }

        public synchronized void sayHelloBack(PolitePerson person) {
            System.out.format("%s: %s" + " has said hello back to me!%n", this.name, person.getName());
        }
    }
}

我花了一个多小时来了解这里的情况,但没有得到它。这是我得到的输出

Jane: John has said hello to me!
John: Jane has said hello to me!

或者我在这里误解了同步。

标签: javaconcurrencydeadlock

解决方案


标有 的方法synchronized锁定临界区(方法),this用作锁。要进入临界区(并锁定它),线程需要获取相应的锁。如果该部分已经被锁定,则线程在入口处被阻塞并等待锁被释放。

A 和 B 是线程:

  • A 调用jane.sayHello(john)和锁定jane
  • B 调用john.sayHello(jane)并锁定john

请注意sayHello标有synchronized

  • 阿来电person.sayHelloBack(this),在person哪里john
  • B 来电person.sayHelloBack(this),在person哪里jane

请注意,sayHelloBack它也标有synchronized

  • B 持有john,因此 A 的呼叫john.sayHelloBack被阻止。

  • A 持有jane,因此 B 的呼叫jane.sayHelloBack被阻止。

  • A 正在等待 B 释放锁,反之亦然。

  • 僵局。


推荐阅读