有人可以通过Java代码(伪)示例向我解释Reentrant lock
和deadlock
之间的关系吗?
最佳答案
凹入锁定机制允许持有锁的螺纹重新进入临界区。这意味着您可以执行以下操作:
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()
。轰!