【问题标题】:In an Apache Tomcat application, do MBean fields need to be volatile/synchronized for JMX updates to appear in other threads?在 Apache Tomcat 应用程序中,MBean 字段是否需要可变/同步才能使 JMX 更新出现在其他线程中?
【发布时间】:2012-04-27 21:32:32
【问题描述】:

我一直在我们的 Spring Web 应用程序中公开 bean,以防我们需要即时进行配置更改。最近我一直在审查并发性,我开始想知道当您通过 JMX 对其中一个 bean 进行变异时,其他线程中会发生什么?

JMX 是否有某种方式强制刷新内存模型,因此您不必担心使字段易失/同步以确保其他线程看到更改?

当 Tomcat 创建一个新线程来处理请求时,即使该字段不是线程安全的,该线程也会看到更改,对吗?因此,除非我需要更改立即在当前请求线程中生效,否则有什么理由担心并发问题?

【问题讨论】:

  • Arlo,你能举一个例子,你是如何使用 JMX 改变你的 bean 的吗?
  • @Rob - 用于构建 URL 或布尔值以禁用功能的字符串字段。我猜测当 Tomcat 产生一个新线程来处理请求时,创建线程的行为会在内存中获取最新值(即使该字段不是易失性的),但我只是想确定一下。就我而言,我并不担心当前的活动线程会立即看到突变,但我很好奇。根据 Gray 的说法,JMX 在并发方面没有做任何特别的事情。

标签: java tomcat concurrency jmx mbeans


【解决方案1】:

JMX 处理程序不是特殊线程。需要在其他线程中看到的任何更改需要标记为volatilesynchronized

// this needs to be volatile because another thread is accessing it
private volatile boolean shutdown;
...

@JmxOperation(description = "Shutdown the server")
public void shutdownSystem() {
   // this is set by the JMX connection thread
   shutdown = true;
}

也就是说,通常 JMX 值是统计数据或配置设置,我不介意在跨越下一个内存障碍时延迟更新。这适用于计数器和其他调试信息以及布尔值和其他仅由 JMX 设置的值,尽管它们被其他线程使用。在这些情况下,我确实将字段标记为volatile,它还没有咬我们。 YMMV。

仅供参考,@JmxOperation 注释来自 my SimpleJmx library

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多