我有一份资源清单。读取器进程可以同时访问其中的每一个,但有时会出现写入进程并更改对象,该对象要求在更新时不对资源运行读取进程。 Java ReentrantReadWriteLock
似乎正确地处理了这种情况,所以我已经为每个资源分配了其中一个,以最大化应用程序的吞吐量。但是我遇到了删除条目的问题。某些写入进程可能会从此列表中删除可访问的资源。
想象一下以下的情景:
readLock().lock()
语句并开始在队列中等待释放writelock 我如何正确处理这种情况?如果我可以在等待的读取线程上调用interrupt()
,那将是好的,因为getQueuedReaderThreads
的API描述表明它不可靠,因为新的线程可以在构建列表时获取读锁定,因此我可以'请确保我将取消所有主题。
答案 0 :(得分:3)
我认为将“已删除”标志与每个资源相关联要容易得多。
当读者获取锁时,它应该检查该标志并正确处理资源被删除时的情况。由于writer在删除资源后立即释放其锁定,并且每个读取器在发现资源被删除后应立即释放其锁定,因此此处不应存在长时间阻塞,因此您不需要中断线程。
您可以在自己的API后面隐藏此行为(例如,当读者获取对已删除资源的锁定时,您可以抛出类似ResourceDeletedException
的内容)。