使用线程处理多个 tryLock() 调用
Handle multiple tryLock() calls with a thread
作为线程间同步的方法,在Java中我们可以使用ReentrantLock
class。它有一个名为 tryLock()
的方法,它允许线程在注意到尚未获取线程时不等待。由于它 returns 是一个布尔值,它可以与 if
语句组合,使线程在无法获取锁时做其他事情,类似于:
if (lock.tryLock()) {
// Do things inside the lock
lock.unlock();
} else {
// The lock was occupied, do other things
}
在那之前一切都很好。然而,假设我们有两个(或更多)锁,并且我们希望在进入临界区之前获得这两个锁。在某些特定情况下,第一个锁可用,但第二个锁不可用。为了让这个场景正常工作,我提出了一些可供选择的选项。请注意,我更担心锁的解锁,而不是锁定:
// Option 1
if (lock1.tryLock() && lock2.tryLock()) {
// Congratulations! You are inside both locks
} else {
// How to know if you got a lock, and if so, which one?
// You will need to "blindly" unlock both
try {
lock1.unlock();
lock2.unlock();
} catch (IllegalStateMonitorException e) {
// Thrown when you unlock a lock which is not yours
}
}
在我的实现中,第一个选项基本上忽略了一个异常,这可能会在执行过程中的某个时刻引起问题。
// Option 2
if (lock1.tryLock()) {
if (lock2.tryLock()) {
// Congratulations! You are inside both locks
// Do things
lock2.unlock();
}
lock1.unlock();
}
第二个选项利用了可能没有获得第二个锁但获得了第一个锁的事实。我发现这更有效和直观。
您认为哪个选项最好?关于这个主题,你有更好的实现吗?
只使用第二种变体。第一个会引起问题,例如当第二个锁被另一个线程持有时。它也不会以正确的(相反)顺序解锁锁。
作为线程间同步的方法,在Java中我们可以使用ReentrantLock
class。它有一个名为 tryLock()
的方法,它允许线程在注意到尚未获取线程时不等待。由于它 returns 是一个布尔值,它可以与 if
语句组合,使线程在无法获取锁时做其他事情,类似于:
if (lock.tryLock()) {
// Do things inside the lock
lock.unlock();
} else {
// The lock was occupied, do other things
}
在那之前一切都很好。然而,假设我们有两个(或更多)锁,并且我们希望在进入临界区之前获得这两个锁。在某些特定情况下,第一个锁可用,但第二个锁不可用。为了让这个场景正常工作,我提出了一些可供选择的选项。请注意,我更担心锁的解锁,而不是锁定:
// Option 1
if (lock1.tryLock() && lock2.tryLock()) {
// Congratulations! You are inside both locks
} else {
// How to know if you got a lock, and if so, which one?
// You will need to "blindly" unlock both
try {
lock1.unlock();
lock2.unlock();
} catch (IllegalStateMonitorException e) {
// Thrown when you unlock a lock which is not yours
}
}
在我的实现中,第一个选项基本上忽略了一个异常,这可能会在执行过程中的某个时刻引起问题。
// Option 2
if (lock1.tryLock()) {
if (lock2.tryLock()) {
// Congratulations! You are inside both locks
// Do things
lock2.unlock();
}
lock1.unlock();
}
第二个选项利用了可能没有获得第二个锁但获得了第一个锁的事实。我发现这更有效和直观。
您认为哪个选项最好?关于这个主题,你有更好的实现吗?
只使用第二种变体。第一个会引起问题,例如当第二个锁被另一个线程持有时。它也不会以正确的(相反)顺序解锁锁。