1

RMI を使用して分散アルゴリズムを実装しています。非常に大きなオブジェクトを送信しているため、RMI がシリアル化されたオブジェクトをネットワーク経由で送信するタイミングについて、ある程度の精度が必要です。

次のメソッドを持つ Remote クラスがあるとします。

class MyServer extends Remote {
    public synchronized void foo (Bar bar) {
        ...
        Thread.wait();
        ...
    }
}

現在、MyServer.foo メソッドを呼び出す 2 つ (またはそれ以上) の RMI クライアントがあります。クライアント 1がそれ​​を呼び出すと、Thread.wait()でブロックされます。次に、クライアント 2がfooを呼び出すと、クライアント 1 がまだ同期されているfooメソッドにあるため、ブロックされます。

さて、問題は次のとおりです。クライアント 2呼び出しのbarパラメータがネットワークを介して送信されるのはいつですか。クライアント 2が実際にfooメソッドに入ることができるのは1 回だけ、またはそれがブロックされる前に ?

おまけの質問: これ (オブジェクトが送信される時間) は RMI 仕様によって強制される動作ですか、それとも実装固有ですか?

4

2 に答える 2

1

あなたの例にはいくつかの問題があるようです。

Threadにはそのようなメソッドがないため、Thread.wait()は実際にはthis.wait()であると思います。また、待機は、同期の実行に使用されるのと同じオブジェクトで呼び出す必要があります。

これを想定すると、クライアント1がlock.wait()を呼び出すと、同期ブロックのモニターが解放されます。これは、クライアント2がメソッドにアクセスでき、最終的に同じ待機メソッドでブロックされることを意味します。他のスレッドがMyServerの同じインスタンスでnotify()を呼び出すと、wait()が解放されます。

シリアル化に関しては、このメソッドが呼び出される前に発生します。これは、このメソッドを呼び出すRMIコード内で発生します。

于 2009-08-10T16:40:40.323 に答える
1

bar パラメータは、 RMIプロトコルの一部である foo メソッドを呼び出す要求と同じ要求で送信されます。

于 2009-08-10T17:13:27.653 に答える