0

我有一个可以通过 jconsole/Visual VM 访问的服务。

@ManagedResource
public class MyService
{
  private String foo;

  @ManagedAttribute
  public void setFoo(String newVal) { this.foo = newVal; }

  @ManagedAttribute
  public String getFoo() { return this.foo; }

  //some other things here that access foo
}

但是看起来fooweb 应用程序控制器收到的值并不总是与我在 jconsle 或可视 VM 中单击 getFoo() 时获得的值相匹配。此外,调试器向我显示我的控制器获得的值不是我在 jconsole 中看到的值。

任何的想法?

4

1 回答 1

2

但是看起来网络应用程序控制器收到的 foo 的值并不总是与我在 jconsle 或可视 VM 中单击 getFoo() 时得到的值相匹配。此外,调试器向我显示我的控制器获得的值不是我在 jconsole 中看到的值。

我不确定,但我怀疑该值foo在各个线程之间没有正确同步内存。如果它是由与显示值的线程不同的线程更新的,您应该这样做foo——volatile或者忍受 JMX 已过时。

private volatile String foo;

当然,JMX 请求是从您的 Web 应用程序将由其处理的不同线程发出的。然而,我原以为调试器不会有问题。

编辑:

经过一番来回,我问是否有可能MyService创建/使用该类的 2 个实例。@abcXYZSystem.out.println("getting foo in " + System.identityHashCode(this) + " = " + foo);在 getter 和 setter 方法中添加了类似的东西,这表明由于某种原因实际上有 2 个不同的类实例因此,JMX 线程正在查看其中一个,而 Web 应用程序正在使用另一个。哎哟。

于 2013-09-18T21:50:38.070 回答