我有一个资源清单。读取器进程可以同时访问其中的每一个,但有时会出现写入进程并更改对象,这要求在更新时没有读取进程在资源上运行。JavaReentrantReadWriteLock
似乎可以正确处理这种情况,因此我将其中一个分配给每个资源,以最大限度地提高应用程序的吞吐量。但是,我面临删除条目的问题。某些写入进程可能会从此列表中删除可访问资源。
想象以下场景:
- 删除进程获取被删除资源的锁
- 同时读取器进程到达
readLock().lock()
语句并开始在队列中等待写锁被释放 - 删除进程从列表中删除资源并调用资源关闭以完成
- 删除进程释放资源的写锁
- 恢复第一个等待读取进程并开始使用现在不一致的资源对象
我该如何正确处理这种情况?如果我可以调用interrupt()
等待的读取线程会很好,但是作为getQueuedReaderThreads
状态的 API 描述它不可靠,因为新线程可以在构建列表时获取读取锁,所以我不能确定我会取消所有线程.