4

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

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

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

4

1 回答 1

4

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注释来自我的 SimpleJmx library

于 2012-04-27T21:51:21.647 回答