4

その場で構成を変更する必要がある場合に備えて、Spring Web アプリケーションで Bean を公開しています。最近、並行性について調べていて、JMX を介してこれらの Bean の 1 つを変更すると、他のスレッドで何が起こるのか疑問に思い始めました。

JMX にはメモリ モデルの更新を強制する何らかの方法があるので、他のスレッドが確実に変更を認識できるように、フィールドを揮発性/同期化することを心配する必要はありませんか?

Tomcat がリクエストを処理するために新しいスレッドを作成すると、フィールドがスレッドセーフでなくても、そのスレッドは変更を認識しますよね? したがって、変更を現在のリクエスト スレッドですぐに有効にする必要がない限り、同時実行の問題について心配する理由はありますか?

4

1 に答える 1

4

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;
}

とは言うものの、通常、JMX の値は統計または構成設定であり、次のメモリ バリアを越えたときに遅延更新されてもかまいません。これは、カウンターやその他のデバッグ情報、およびブール値やその他の値 (JMX によってのみ設定されるが、他のスレッドによって使用される) に適用されます。そのような場合、私はフィールドにマークを付けておらvolatile、まだ噛まれていません. YMMV。

参考までに、@JmxOperation注釈はSimpleJmx ライブラリからのものです。

于 2012-04-27T21:51:21.647 に答える