我试图理解java中的重入锁,我正在寻找一个简单的解释。为什么需要锁定重入?它解决了什么问题?一个示例场景会有所帮助。
答案 0 :(得分:3)
可重入锁定是同一个线程可能多次获取的锁定。通常,重入锁必须解锁的次数与锁定的次数相同。重入锁通常更容易编码。如果你有几种方法,其中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
并尝试获取锁定的那一刻,您将陷入僵局,因为锁已经拥有,即使它恰好拥有你自己。
例如,初始化为一个计数的纯计数信号量是一个非重入锁定。如果同一个线程试图获取它两次,它将永远阻止一种自我死锁。