【问题标题】:is Message thread safe消息线程是否安全
【发布时间】:2013-12-30 12:11:09
【问题描述】:

JMS 2.0 规范第 2.14 节:

JMS 可能要求其所有对象都支持并发使用。 由于对并发访问的支持通常会增加一些开销和 复杂性,JMS 设计限制了它对并发的要求 访问那些自然会被 a 共享的对象 多线程客户端。其余对象被设计为 一次由一个逻辑控制线程访问。

支持并发使用: 目的地、连接工厂、连接

不支持并发使用: JMSContext、Session、生产者、消费者

不确定为什么规范中没有讨论 Message 的线程安全性?

编辑

消息线程安全吗?两个线程可以共享吗?

没有。消息不是线程安全的。它不应该在线程之间共享。

【问题讨论】:

  • 为什么需要在多个线程中访问同一个 Message 对象?特别是在多线程中修改消息。您可以允许多个消费者并发读取。
  • 在线程之间共享消息是安全的,除非他们试图修改消息
  • 场景 - 两个线程处理负载和设置消息属性。可以在没有种族的情况下并行完成吗?
  • @AmitG 这是一个非常奇怪的用例。但是不,它不能通过 JMS 消息来完成。
  • @AmitG 请参阅第 6.2 章,其中说会话创建的任何对象都不是线程安全的。消息由会话创建(显式地或隐式地从会话创建的另一个对象创建)。不过,您可以自己锁定以从多个线程访问它。

标签: java multithreading concurrency thread-safety jms


【解决方案1】:

消息不是线程安全的。 Message 是可变的,它具有设置器,因此当一个线程使用 Message 时,另一个线程可以干扰和更改它。

【讨论】:

  • 我确实研究了 JMS-spec 的开源实现,认为 Message 不安全。想知道为什么它不规范?
猜你喜欢
  • 1970-01-01
  • 2012-08-21
  • 2018-05-12
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 1970-01-01
相关资源
最近更新 更多