我有这个(简化)场景:
@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();
}
首先,我获取了一个读锁,然后在SAME线程上我尝试获取写锁。我的假设是,当我在同一个线程上时,应该获取写锁定。
首先,我的假设出了什么问题?那么,可以使用什么模式(标准Java锁定机制)来允许同一线程的任意嵌套读/写锁?
答案 0 :(得分:1)
你的假设没有错。事实上,这不是一个假设,它是一个记录良好的事实。来自ReentrantReadWriteLock.WriteLock.lock()
:
如果另一个线程
不保持读取和写入锁定,则获取写入锁定
如果在同一个帖子上多次获取时被阻止,则不会是可重入的。
¹事实上,事实上没有那么好记录,请参阅评论部分