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

的 API

如果锁定状态与给定的标记匹配,则自动执行以下操作之一。如果标记表示持有写锁,则返回它。 或者,如果有读锁,如果写锁可用,则释放读锁并返回一个写戳。或者,如果是乐观读,则仅在立即可用时才返回写戳。在所有其他情况下,此方法返回零。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...