【问题标题】:ReentrantReadWriteLock on same thread [duplicate]同一线程上的 ReentrantReadWriteLock [重复]
【发布时间】:2017-08-31 06:31:35
【问题描述】:

我有这个(简化的)场景:

@Test
public void testSameThread() throws InterruptedException {
    ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock();
    rwlock.readLock().lock();
    {
        if (rwlock.writeLock().tryLock(50, TimeUnit.MILLISECONDS)) {
            // long-running op
            Thread.sleep(100);
            rwlock.writeLock().unlock();
        } else {
            fail();
        }
    }
    rwlock.readLock().unlock();
}

首先,我获取一个读锁,然后在同一个线程上我尝试获取写锁。我的假设是因为我在同一个线程上,所以应该获取写锁。

首先,我的假设有什么问题?那么,什么样的模式(标准的Java锁机制)可以用来允许同一个线程任意嵌套读/写锁呢?

【问题讨论】:

  • 您只是在这里做一个假设并且您得到了明确的答案,您的问题表明某些事情没有按您预期的那样工作,请在您的问题中添加更多详细信息,预期和观察到的行为?是什么让您说它没有按预期工作?

标签: java multithreading


【解决方案1】:

你的假设没有错。事实上,这不是假设,而是有据可查的¹事实。来自ReentrantReadWriteLock.WriteLock.lock()

如果另一个线程都没有持有读锁和写锁,则获取写锁

如果在同一线程上多次获取时被阻塞,则不会是可重入的。

¹事实上,毕竟没有很好的文档记录,请参阅 cmets 部分

【讨论】:

  • 那么,这是 WriteLock impl 中的错误吗?我应该改用什么?
  • 代码的bug在哪里(没那么复杂)?
  • 其实这里有个“bug”,不过是文档不清晰的形式。 RRWL 允许您降级为读锁,但要升级为写锁,您需要先释放读锁。
  • @erdal.karaca 抱歉。本身不是错误,但绝对是不清楚的文档。
  • 谢谢,您帮助了解了如何使测试通过。我建议在您的答案中也反映降级方面以供将来参考...
猜你喜欢
  • 2016-03-05
  • 2015-06-16
  • 2016-11-15
  • 2014-06-08
  • 2016-09-11
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多