可重入锁是同一线程可以多次获取的锁。通常,可重入锁的解锁次数必须与锁定次数相同。可重入锁通常更容易编写代码。如果您有多个方法,其中 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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
其中其他代码可以调用任何一个doA或doB或doC,并且所有这些代码都使用相同的锁围绕某些工作进行同步。使用的锁是“可重入的”,因为同一线程可以多次获取它。如果锁是不可重入的,那么当你调用 时doA,在你进入并尝试获取锁的那一刻doB,你就会死锁,因为锁已经被拥有了,即使它恰好是你自己所拥有的。
例如,初始化为计数 1 的纯计数信号量是不可重入锁。如果同一个线程尝试两次获取它,它将永远阻塞在一种自死锁中。
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |