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

时间:2018-03-11 04:03:14

标签: java concurrency

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);
}

作者写道:

  

调用tryConvertToWriteLock()不会阻止,但可能会返回一个零标记,表示当前没有写锁定。在这种情况下,我们调用writeLock()来阻止当前线程,直到写锁定可用。

关于tryConvertToWriteLock()失败的情况,我是否遗漏了某些内容,或者是作者获取了读锁定,后来是写锁定,还是从不释放读锁定?

此外,赢得lock.writeLock()死锁等待当前线程释放其读锁?

1 个答案:

答案 0 :(得分:2)

我认为文章提供的代码示例是错误的。根据{{​​3}}

  

与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);
    }
}

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