Arl*_*rlo 5 java concurrency tomcat jmx mbeans
我已经在 Spring Web 应用程序中公开了 Bean,以防我们需要动态更改配置。最近,我一直在审查并发性,我开始想知道当您通过 JMX 改变其中一个 bean 时,其他线程中会发生什么?
JMX 是否有某种方法强制刷新内存模型,以便您无需担心使字段变得易失/同步以确保其他线程看到更改?
当 Tomcat 创建一个新线程来处理请求时,即使该字段不是线程安全的,该线程也会看到更改,对吗?因此,除非我需要更改立即在当前请求线程中生效,否则是否有理由担心并发问题?
JMX 处理程序不是特殊线程。任何需要在其他线程中看到的更改都需要标记为volatile或synchronized。
// 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;
}
Run Code Online (Sandbox Code Playgroud)
也就是说,通常 JMX 值是统计数据或配置设置,我不介意在跨越下一个内存屏障时延迟更新。这适用于计数器和其他调试信息以及仅由 JMX 设置的布尔值和其他值,尽管它们由其他线程使用。在这些情况下,我不会将字段标记为volatile,而且它还没有影响到我们。YMMV。
仅供参考,@JmxOperation注释来自我的 SimpleJmx 库。
| 归档时间: |
|
| 查看次数: |
457 次 |
| 最近记录: |