我有一个独立的 JMS 应用程序,它订阅了几个不同的 JMS 主题。每个主题都有自己的 session 和 onMessage() 监听器。每个 onMessage() 方法更新一个公共(public)当前值表 - 所有 onMessage() 方法更新同一个当前值表。
我读到 onMessage 方法实际上是在 JMS 提供者的线程上调用的。所以,我的问题是:如果所有这些 onMessage() 方法都是在与我的应用程序不同的线程上调用的,那么这是否会出现并发问题,因为所有这些线程都会更新一个通用的 CVT?似乎我需要以某种方式同步对 CVT 的访问?
最佳答案
对您的问题的简短回答:是的,当您的 JMS 代码更新一些常见的内存中对象时,您需要注意并发问题。
但是,我不确定您所说的“常用当前值表”是什么意思?如果这是一些数据库表,那么数据库应该为您处理并发问题。
编辑:事实证明“公共(public)当前值表”是一个公共(public)内存对象。正如我之前提到的,在这种情况下,您需要自己处理并发问题 (Java concurrency tutorial)。
这个问题主要有两种解决方法:
- synchronization - 适用于低争用或者您被一些非线程安全对象所困,那么您最好的选择是同步。
- high-level concurrency objects JDK 附带的 - 如果您有高竞争并且您正在使用来自常规集合的一些类,则最适合;只需交换一个 concurrent collections 的实例.
无论如何,强烈建议进行自己的测试以选择最适合您的方法。
如果您要处理创建非线程安全无状态过程代码(不涉及数据存储)的昂贵问题,那么您也可以使用对象池(例如 Commons Pool),但这不是与您当前的问题相关。
JMS onMessage()
方法总是由 JMS 提供者的线程调用(也称为异步调用)。
关于java - JMS onMessage() 和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4008066/