这个问题已经在这里有了答案:
9年前关闭。
我试图了解Java中的可重入锁,并且正在寻找一个简单的解释。为什么必须重新输入锁?它解决什么问题?一个示例场景会有所帮助。
最佳答案
可重入锁是,同一线程可能获得不止一次的锁。通常,可重入锁必须与被锁定相同的次数被解锁。可重入锁通常更容易编码。如果您有几种方法,其中A调用B且B调用C ...,但是此代码的客户端可以调用A或B或C,并且您想在每个方法中进行锁定,则可重入锁定将解决您的问题。问题。它将阻止一次除一个线程以外的任何线程访问此代码,但是它将允许多次锁定获取,因此您不会死锁自己。
假设您有以下内容:
public class SyncTest {
private final Lock lock = new ReentrantLock();
public void doA() {
lock.lock();
try {
doB();
doSomethingForA();
} finally {
lock.unlock();
}
}
public void doB() {
lock.lock();
try {
doC();
doSomethingForB();
} finally {
lock.unlock();
}
}
public void doC() {
lock.lock();
try {
doSomeWorkThatEveryoneDoes();
} finally {
lock.unlock();
}
}
}
其他代码可以调用
doA
或doB
或doC
中的任何一个,并且所有这些代码都使用相同的锁在某些工作周围进行同步。使用的锁是“可重入”的,因为同一线程可以多次获取该锁。如果该锁不是可重入的,则当您调用doA
时,在您输入doB
并尝试获取该锁的那一刻,您将死锁,因为该锁已被拥有,即使它恰好是您自己拥有的。例如,初始化为1的计数的纯计数信号量是不可重入锁。如果同一线程尝试两次获取它,它将以某种自死锁的方式永远阻塞。