假设我有3个方法:A,B和C,它们都需要以同步方式访问(我将使用Java Reentrant Lock作为示例,但我正在寻找解决此问题的任何方法)。其中一种方法(比如A)需要在等待另一个(B)获得锁定时释放锁定,以便它可以更新某些状态。然而,当A释放锁定时,我只希望它被B“或”或“C”或任何其他例程“克制”。
Lock lock = new ReentrantLock();
Condition cond = lock.newCondition();
boolean satisfied = false;
methodA() {
lock.lock();
// ...
while(!satisfied) {
// releases lock, waits for methodB to update state
cond.await();
}
// ...
L.unlock();
}
methodB() {
L.lock();
// updates state, and notifies
satisfied = true;
condition.signalAll();
L.unlock();
}
methodC() {
// Don't want C to be able to claim lock while A is doing await()
L.lock();
// ...
L.unlock();
}
换句话说,methodA提供了对methodB的特权访问。在寻找一段时间后,我找不到任何明显的解决方案,但我想通过某种锁定级别机制解决了这个问题,即:
methodA() {
lock.privilegedLock();
// ...
L.unlock(); // exits privileged state if it is last privileged lock
}
methodB() {
L.privilegedLock();
// ...
L.unlock(); // exits privileged state if it is last privileged lock
}
methodC() {
// Don't want C to be able to claim lock while
// it is in "privileged" lock state.
L.normalLock();
// ...
L.unlock();
}
主要的限制是所有操作都需要使用相同的锁进行同步,否则我会因锁定顺序而遇到死锁问题,因为这些方法遍布多个类,这些类互相双向交互。
提前致谢!