首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StampedLock.writeLock()是否释放当前线程持有的读锁?

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

Stack Overflow用户
提问于 2018-03-11 04:03:13
回答 1查看 735关注 0票数 6

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

代码语言:javascript
复制
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()死锁不会等待当前线程释放其读锁吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-11 04:26:44

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

与信号量一样,与大多数锁实现不同的是,StampedLocks 没有所有权的概念。在一个线程中获得的锁可以在另一个线程中释放或转换。

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

代码语言:javascript
复制
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);
    }
}

注意他们是如何在获得写锁之前释放读锁的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49216525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档