为了理解Java 8中的乐观锁定,我遇到了以下代码。原版博客。
正如在博客中解释的那样,这段代码试图将读锁转换为写lock.The代码,如果读锁转换为写锁失败,则请求显式写锁。
令我费解的是,,当父线程已经持有读锁时,怎么可能会授予显式写锁呢?--在强制请求写锁之前,它看起来并不像读取锁在任何时候都被释放。据我错误的理解,线程会无限地等待写锁,因为读取锁从未释放,从而造成死锁。
,为什么这不会导致这里的死锁?
ExecutorService executor = Executors.newFixedThreadPool(2);
StampedLock lock = new StampedLock();
executor.submit(() -> {
long stamp = lock.readLock();
try {
if (count == 0) {
stamp = lock.tryConvertToWriteLock(stamp);
if (stamp == 0L) {
System.out.println("Could not convert to write lock");
stamp = lock.writeLock();
}
count = 23;
}
System.out.println(count);
} finally {
lock.unlock(stamp);
}
});
stop(executor);提前感谢!
发布于 2021-01-13 16:43:17
这个有用吗?来自API for tryConvertToWriteLock
如果锁状态与给定的邮票匹配,则原子地执行以下操作之一。如果邮票表示持有写锁,则返回它。,或者,如果读锁可用,则释放读锁并返回一个写戳。,或者,如果是乐观读,则只有在立即可用时才返回写标记。在所有其他情况下,此方法返回零。
https://stackoverflow.com/questions/65705957
复制相似问题