ReentrantReadWriteLock中断等待读取线程

时间:2012-10-11 09:07:00

标签: java concurrency resources

我有一份资源清单。读取器进程可以同时访问其中的每一个,但有时会出现写入进程并更改对象,该对象要求在更新时不对资源运行读取进程。 Java ReentrantReadWriteLock似乎正确地处理了这种情况,所以我已经为每个资源分配了其中一个,以最大化应用程序的吞吐量。但是我遇到了删除条目的问题。某些写入进程可能会从此列表中删除可访问的资源。

想象一下以下的情景:

  • 删除进程获取对正在删除的资源的锁定
  • 同时读者进程到达readLock().lock()语句并开始在队列中等待释放writelock
  • 删除进程会从列表中删除资源,并在资源上调用shutdown以完成
  • 删除进程释放资源上的写锁定
  • 恢复第一个等待的读取过程并开始使用现在不一致的资源对象

我如何正确处理这种情况?如果我可以在等待的读取线程上调用interrupt(),那将是好的,因为getQueuedReaderThreads的API描述表明它不可靠,因为新的线程可以在构建列表时获取读锁定,因此我可以'请确保我将取消所有主题。

1 个答案:

答案 0 :(得分:3)

我认为将“已删除”标志与每个资源相关联要容易得多。

当读者获取锁时,它应该检查该标志并正确处理资源被删除时的情况。由于writer在删除资源后立即释放其锁定,并且每个读取器在发现资源被删除后应立即释放其锁定,因此此处不应存在长时间阻塞,因此您不需要中断线程。

您可以在自己的API后面隐藏此行为(例如,当读者获取对已删除资源的锁定时,您可以抛出类似ResourceDeletedException的内容)。