1

我有一个资源清单。读取器进程可以同时访问其中的每一个,但有时会出现写入进程并更改对象,这要求在更新时没有读取进程在资源上运行。JavaReentrantReadWriteLock似乎可以正确处理这种情况,因此我将其中一个分配给每个资源,以最大限度地提高应用程序的吞吐量。但是,我面临删除条目的问题。某些写入进程可能会从此列表中删除可访问资源。

想象以下场景:

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

我该如何正确处理这种情况?如果我可以调用interrupt()等待的读取线程会很好,但是作为getQueuedReaderThreads状态的 API 描述它不可靠,因为新线程可以在构建列表时获取读取锁,所以我不能确定我会取消所有线程.

4

1 回答 1

3

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

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

您可以将此行为隐藏在您自己的 API 后面(例如,您可以ResourceDeletedException在 reader 获取已删除资源的锁时抛出类似的东西)。

于 2012-10-11T09:19:30.947 回答