假设我有两个关键资源,foo 和 bar。我用一些ReentrantReadWriteLock
s保护他们
ReentrantReadWriteLock foo = new RRWL() ...
ReentrantReadWriteLock bar = new RRWL() ...
大多数操作只使用 foo OR bar,但其中一些恰好同时使用两者。现在,当使用单个锁时,您不能只这样做:
void foo() {
foo.writeLock().lock();
privateWorkOnFoo();
foo.writeLock().unlock();
}
如果抛出异常,您的 foo 将永远锁定。相反,您将其包装起来,例如
void foo() {
try {
foo.writeLock().lock();
privateWorkOnFoo();
} finally { foo.writeLock().unlock(); }
}
但是,如果我需要同时处理这两个问题怎么办?把它们放在一个街区里安全吗?
选项1
try {
foo.writeLock().lock();
bar.writeLock().lock();
magic();
} finally {
bar.writeLock().unlock();
foo.writeLock().unlock();
}
或者是否有必要给每个锁自己的块:
选项 2
try {
foo.writeLock().lock();
try {
bar.writeLock().lock();
magic();
} finally {
bar.writeLock().unlock();
}
} finally {
foo.writeLock().unlock();
}
我不可能是第一个很难调查此问题的人......我知道选项 2 有“防弹”,但它也需要大量的维护。选项1可以接受吗?