免责声明:我不太擅长Java,我只是比较C#和Java之间的读/写锁来更好地理解这个主题&这两个实现背后的决策。
有JavaDoc关于ReentrantReadWriteLock。它说明了关于锁的升级/降级的如下内容:
它还有下面的示例,显示从读锁到写锁的手动升级:
// Here is a code sketch showing how to exploit reentrancy
// to perform lock downgrading after updating a cache
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// upgrade lock manually
#1: rwl.readLock().unlock(); // must unlock first to obtain writelock
#2: rwl.writeLock().lock();
if (!cacheValid) { // recheck
...
}
...
}
use(data);
rwl.readLock().unlock();这是否意味着上面的示例在某些情况下可能不正确--我的意思是在#1和#2行之间没有锁,底层结构暴露于其他线程的更改中。所以不能把它看作是升级锁的正确方法,还是我在这里漏掉了什么?
发布于 2010-05-23 08:44:56
是的,你是对的。但是这段代码在获得写锁后再次调用if (!cacheValid) { // recheck来处理这种情况。
https://stackoverflow.com/questions/2891111
复制相似问题