2009-08-10 5 views
1

私はRMIを使って分散アルゴリズムを実装しています。かなり大きなオブジェクトを送信しているので、RMIがネットワーク経由でシリアル化オブジェクトを送信するときにいくつかの精度が必要です。Java RMIを使用すると、ネットワーク経由でシリアル化されたオブジェクトが正確に送信されるのはいつですか?

次の方法でリモートクラスがあるとします。

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

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

さて、質問です:ネットワーク上で送信クライアント2コールのバーパラメータがある場合は?一度だけクライアント2は実際にはブロックされたときにfooの方法を入力することができますか?

ボーナスに関する質問:これは、オブジェクトが送信される時刻で、RMI仕様によって強制される動作か、この実装固有の動作ですか?

+0

このコードはコンパイルされません。あなたが何を求めているのか不明です。 – EJP

答えて

1

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

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

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

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

+0

'Thread.wait()'は実際にはメソッドですが、 'Object.wait()'から継承されています。 – EJP

1

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

関連する問題