我对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
}
答案 0 :(得分:4)
通常在使用锁时,你会做类似的事情。
Lock lock = ...; // Create type of lock
lock.lock();
try {
// Do synchronized stuff
}
finally {
lock.unlock();
}
这可确保锁定始终在块结束时解锁。无论是否抛出异常。由于您使用的是可重入锁定,因此可以将其置于两种方法中,并且它将正常工作,而不是在最后一个finally块执行之前释放锁定。
编辑:Lock界面的Javadoc重新发布了我发布的内容。