我有一份资源清单。读取器进程可以同时访问其中的每一个,但是有时会出现一个写进程并改变对象,这就要求在更新时没有在资源上运行读取进程。Java的ReentrantReadWriteLock似乎正确地处理了这种情况,因此我将其中的一个分配给每个资源,以最大限度地提高应用程序的吞吐量。然而,我正面临着一个问题,进入删除。一些写入进程可能会从此列表中删除可访问的资源。
想象一下下面的场景:
readLock().lock()语句,并开始在队列中等待将要释放的写锁。我怎样才能正确处理这种情况呢?但是,如果我能够在等待的读取线程上调用interrupt(),这将是很好的,但是,由于getQueuedReaderThreads的API描述指出,它不可靠,因为新线程可以在构建列表时获取读锁,因此我无法确定是否会取消所有线程。
发布于 2012-10-11 09:19:30
我认为将“已删除”标志与每个资源关联起来要容易得多。
当读取器获得锁时,它应该检查该标志,并正确处理资源被删除时的情况。因为写入器在删除资源后立即释放其锁,并且每个读取器应该在发现资源被删除后立即释放其锁,因此这里不应该有长期阻塞,因此不需要中断线程。
您可以将这种行为隐藏在自己的API后面(例如,当读取器获得已删除资源的锁时,可以抛出类似ResourceDeletedException的内容)。
https://stackoverflow.com/questions/12836022
复制相似问题