如何解决Java 8 Stamped Lock:为什么这段代码不会导致死锁?
在我试图理解 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
如果锁定状态与给定的标记匹配,则自动执行以下操作之一。如果标记表示持有写锁,则返回它。 或者,如果有读锁,如果写锁可用,则释放读锁并返回一个写戳。或者,如果是乐观读,则仅在立即可用时才返回写戳。在所有其他情况下,此方法返回零。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。