StampedLock.writeLock() 是否释放当前线程持有的读锁?

2023-12-31

http://winterbe.com/posts/2015/04/30/java8-concurrency-tutorial-synchronized-locks-examples/ http://winterbe.com/posts/2015/04/30/java8-concurrency-tutorial-synchronized-locks-examples/包含这段代码:

StampedLock lock = new StampedLock();
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);
}

作者写道:

Calling tryConvertToWriteLock()不会阻塞,但可能返回零标记,指示当前没有可用的写锁。在这种情况下我们调用writeLock()阻塞当前线程,直到有可用的写锁。

关于以下情况tryConvertToWriteLock()失败了,我是否错过了什么,或者作者是否获取了读锁,然后获取了写锁,并且从未释放过读锁?

此外,不会lock.writeLock()等待当前线程释放其读锁时发生死锁吗?


我相信本文提供的代码示例有错误。根据https://docs.oracle.com/javase/9​​/docs/api/java/util/concurrent/locks/StampedLock.html https://docs.oracle.com/javase/9/docs/api/java/util/concurrent/locks/StampedLock.html

与 Semaphore 类似,但与大多数 Lock 实现不同,StampedLocks没有所有权概念。在一个线程中获取的锁可以在另一线程中释放或转换。

此外,他们还提供了以下示例代码:

void moveIfAtOrigin(double newX, double newY) { // upgrade
    // Could instead start with optimistic, not read mode
    long stamp = sl.readLock();
    try {
        while (x == 0.0 && y == 0.0) {
            long ws = sl.tryConvertToWriteLock(stamp);
            if (ws != 0L) {
                stamp = ws;
                x = newX;
                y = newY;
                break;
            }
            else {
                sl.unlockRead(stamp);
                stamp = sl.writeLock();
            }
        }
    } finally {
        sl.unlock(stamp);
    }
}

请注意它们如何在获取写锁之前释放读锁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

StampedLock.writeLock() 是否释放当前线程持有的读锁? 的相关文章

随机推荐