问题描述
在我试图理解 Java 8 中的乐观锁定时,我遇到了下面的一段代码。 Original Blog Here。
如博客中所述,这段代码试图将读锁转换为写锁。如果读锁转换为写锁失败,代码会请求显式写锁。
这让我很困惑当父线程已经持有读锁时,怎么能期望显式写锁被授予?看起来读锁没有被释放强制请求写锁之前的点。根据我有缺陷的理解,线程会无限等待写锁,因为读锁永远不会释放,从而造成死锁。
为什么这里不会导致死锁?
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);
提前致谢!
解决方法
这有帮助吗?来自 tryConvertToWriteLock
如果锁定状态与给定的标记匹配,则自动执行以下操作之一。如果标记表示持有写锁,则返回它。 或者,如果有读锁,如果写锁可用,则释放读锁并返回一个写戳。或者,如果是乐观读,则仅在立即可用时才返回写戳。在所有其他情况下,此方法返回零。