首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ReentrantReadWriteLock中断等待读取线程

问用ReentrantReadWriteLock中断等待读取线程
EN

Stack Overflow用户
提问于 2012-10-11 09:07:00
回答 1查看 259关注 0票数 1

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

想象一下下面的场景:

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

我怎样才能正确处理这种情况呢?但是,如果我能够在等待的读取线程上调用interrupt(),这将是很好的,但是,由于getQueuedReaderThreads的API描述指出,它不可靠,因为新线程可以在构建列表时获取读锁,因此我无法确定是否会取消所有线程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-11 09:19:30

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

当读取器获得锁时,它应该检查该标志,并正确处理资源被删除时的情况。因为写入器在删除资源后立即释放其锁,并且每个读取器应该在发现资源被删除后立即释放其锁,因此这里不应该有长期阻塞,因此不需要中断线程。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12836022

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档