Java:仅针对特定方法释放锁定

时间:2015-09-02 14:31:33

标签: java multithreading synchronization locking

假设我有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();
}

主要的限制是所有操作都需要使用相同的锁进行同步,否则我会因锁定顺序而遇到死锁问题,因为这些方法遍布多个类,这些类互相双向交互。

提前致谢!

0 个答案:

没有答案