Java 线程:共享资源的特殊情况

Java 线程:共享资源的特殊情况,java,multithreading,rabbitmq,Java,Multithreading,Rabbitmq,我有一个特定的资源,可用于两种类型的任务:由多个不同线程同时运行的普通任务和很少由单个线程运行的特殊任务 我的目标是: 除非特殊任务正在运行,否则所有正常任务都应该能够正常访问此资源 特殊任务还应等待此资源空闲(可能正在运行的任何正常任务) 如果特殊任务没有运行,正常任务应该能够同时使用此资源(它是线程安全的) 确切地说,我有一个rabbitmq队列,该队列由该资源访问以弹出消息。任何调用my webservice的用户都可以同时使用此资源(弹出消息)。但是,我有一个特殊的函数,它清除队列并用

我有一个特定的资源,可用于两种类型的任务:由多个不同线程同时运行的普通任务和很少由单个线程运行的特殊任务

我的目标是:

  • 除非特殊任务正在运行,否则所有正常任务都应该能够正常访问此资源
  • 特殊任务还应等待此资源空闲(可能正在运行的任何正常任务)
  • 如果特殊任务没有运行,正常任务应该能够同时使用此资源(它是线程安全的)

  • 确切地说,我有一个rabbitmq队列,该队列由该资源访问以弹出消息。任何调用my webservice的用户都可以同时使用此资源(弹出消息)。但是,我有一个特殊的函数,它清除队列并用来自DB的消息重新填充队列


    我的挑战是只针对这个特殊任务锁定对象,但同时允许正常任务同时使用它

    您的目标听起来与a的用例完全相同,它只允许一个编写器,但如果没有编写器,则允许任意的读者。特殊任务可以使用写锁,所有其他任务都可以使用读锁。

    您的目标听起来与a的用例完全相同,它只允许一个编写器,但如果没有编写器,则允许任意读取器。特殊任务可以使用写锁,所有其他任务都可以使用读锁。

    Lol进入管理层后,我变得软弱无力了!编写器将等待任何读卡器,对吗?
    例如,一个最初填充了数据的集合,随后在频繁搜索(例如某种目录)时很少修改,这是使用读写锁的理想选择。
    Lol进入管理后,我变软了!写入程序将等待任何读卡器,对吗?
    例如,一个最初填充了数据,然后在频繁搜索(例如某种目录)时很少修改的集合是使用读写锁的理想选择。