ReentrantReadWriteLock - 在if - else块中锁定/释放

时间:2014-08-14 18:09:16

标签: java multithreading

我对ReadwriteLocks的良好做法有疑问。我之前只使用过同步块,所以请耐心等待。

下面的代码是否正确使用ReadWriteLock?也就是说,

获取私有方法中的锁定。

如果满足条件,则从未释放锁定的私有方法返回。在公共方法中释放锁。

或者:

获取私有方法中的锁定。

如果不满足条件,请立即在私有方法中释放锁。

非常感谢

private List<Integer> list = new ArrayList<Integer>();

private ReadWriteLock listLock = new ReentrantReadWriteLock

public int methodA(int y) {
    ...........
    long ago = methodB(y);
    list.remove(y);
    listLock.writeLock().unlock();
}

private long methodB(int x) {
    listLock.writeLock().lock();
    if(list.contains(x) {
        long value = // do calculations on x
        return value;
    }
    else {
        listLock.writeLock().unlock();
        // return something else unconnected with list
    } 

1 个答案:

答案 0 :(得分:4)

通常在使用锁时,你会做类似的事情。

Lock lock = ...; // Create type of lock
lock.lock();
try {
    // Do synchronized stuff
}
finally {
    lock.unlock();
}

这可确保锁定始终在块结束时解锁。无论是否抛出异常。由于您使用的是可重入锁定,因此可以将其置于两种方法中,并且它将正常工作,而不是在最后一个finally块执行之前释放锁定。

编辑:Lock界面的Javadoc重新发布了我发布的内容。