有人可以通过Java代码(伪)示例向我解释Reentrant lockdeadlock之间的关系吗?

最佳答案

凹入锁定机制允许持有锁的螺纹重新进入临界区。这意味着您可以执行以下操作:

public synchronized void functionOne() {

    // do something

    functionTwo();

    // do something else

    // redundant, but permitted...
    synchronized(this) {
        // do more stuff
    }
}

public synchronized void functionTwo() {
     // do even more stuff!
}

在非重入锁中,当您尝试从functionTwo()调用functionOne()时会遇到死锁的情况,因为线程必须等待该锁本身拥有的锁。

当然,死锁是一种邪恶的情况,其中线程1持有锁A并等待锁B,而线程2持有锁B并等待锁A。因此,两者都无法继续。此代码示例创建一个死锁:
public synchronized void deadlock() throws InterruptedException {
    Thread th = new Thread() {
        public void run() {
            deadlock();
        }
    }.start();

    th.join();
}

调用线程尝试等待产生的线程,而该线程又无法在调用者退出之前调用deadlock()。轰!

08-26 09:20