我有某种资源可以由两种类型的任务使用:由许多不同线程同时运行的普通任务和很少由单个线程运行的特殊任务。
我的目标是:
- 除非特殊任务正在运行,否则所有普通任务都应该能够正常访问此资源。
- 特殊任务还应等待该资源释放(从任何可能正在运行的普通任务中释放)。
- 如果特殊任务未运行,普通任务应该能够同时使用此资源(它是线程安全的)。
准确地说,我有一个 Rabbit-MQ 队列,该资源可以访问该队列来弹出消息。任何调用我的网络服务的用户都可以同时使用此资源(弹出消息)。但是,我有一个特殊的函数可以清除队列并用来自数据库的消息重新填充它。
我的挑战是仅锁定与此特殊任务相关的对象,但同时允许普通任务同时使用它。
最佳答案
您的目标听起来与 ReadWriteLock
的用例完全相同,它只允许一个作者,但如果没有作者,则允许任意读者。特殊任务可以获取写锁,所有其他任务可以获取读锁。
关于java - 线程: Shared Resource special situation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43394777/