1

JMXMBeanのスレッドセーフについての理解を明確にしたいだけです。

私は次のような単純なMBeanを持っています:

public class Person
    implements PersonMBean
{
    private String name;

    public void setName(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }
}

MBeanにアクセスする複数のクライアントが存在する可能性があるという条件で(たとえば、複数のユーザーがjconsoleを介してsetName()を呼び出す)、ゲッターとセッターを同期する必要がありますか?

ありがとう。

4

3 に答える 3

2

同期は必要なものではない場合があります。同期は、発生前の関係を定義しますが、ここでは必要ないと思います。それで

volatile private String name; 

十分かもしれません。

起こった場合-本当に重要になる前に、私は公正なリエントラントロックを使用します。


JLS3から8.3.1.4揮発性フィールド

Javaプログラミング言語は、[同期以外の] 2番目のメカニズムである揮発性フィールドを提供します。これは、一部の目的でロックするよりも便利です。

これはそれらの目的の1つかもしれません。

フィールドは揮発性として宣言される場合があります。その場合、Javaメモリモデル(§17)は、すべてのスレッドが変数の一貫した値を参照することを保証します。

とにかく、17.4.5 Happens-before Order in JLSを見て、この場合に最適なものを決定してください。

于 2013-01-23T04:26:10.847 に答える
1

... there can be multiple clients call[ing] setName() via jconsole, do I need need to synchronize the getter and setter?

Yes, you probably should if multiple threads are calling the getters and setters -- just like you should if multiple local threads are calling the getter and setter. As @user454322 pointed out, using the volatile keyword to accomplish the memory synchronization is also appropriate.

Synchronization of some form is necessary for two reasons. Firstly, multiple JMX operations can be running at the same time meaning that getter and setter race-conditions can happen. Secondly, even if the setter happens before the getter, there is no guarantee that the JMX thread has the updated value without synchronization. It depends on how important it is that each thread gets the last value of the name. If all threads must see the very last name that was set, then you'll need to keep things well synchronized.

This said, we have a lot of unsynchronized JMX getter methods on statistics and other diagnostic information and expect that the JVM will synchronize the various counters at some point.

于 2013-01-23T01:46:16.487 に答える
1

JMX Beanが実行しているのがフィールドの値の設定だけである場合、実行する必要があるのは、フィールドをとして宣言することだけですvolatile。これにより、変数への後続の読み取りで前の書き込みが確実に参照されます。

メソッドを作成してsynchronizedも同じ保証が得られますが、モニターを取得するための追加コストがかかります。

于 2013-01-23T04:15:51.877 に答える