2009-08-10 76 views
1

我正在使用RMI來實現一些分佈式算法,並且由於我們正在傳輸相當大的對象,所以我希望有一些關於RMI何時通過網絡傳輸串行化對象的精確度。使用Java RMI時,是否通過網絡傳輸序列化對象?

假設我有以下方法的Remote類。

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

現在,我有兩個(或更多)RMI客戶端調用MyServer.foo方法。 當客戶端1調用它時,它將被阻止在Thread.wait()。然後,客戶端2個呼叫FOO和它被阻止,因爲客戶端1仍處於FOO方法,該方法是同步的。

現在,問題是:什麼時候客戶端通過網絡傳輸的參數?只有一次客戶端2實際上可以輸入foo方法或之前,當它被阻止?

紅利問題:這是(傳遞對象的時間)是由RMI規範強制實施的行爲還是此實現特定的行爲?

+0

此代碼甚至沒有編譯。不清楚你在問什麼。 – EJP 2017-07-05 03:38:08

回答

1

你的例子似乎有幾個問題。

我認爲Thread.wait()實際上是this.wait(),因爲Thread上沒有這樣的方法。等待應該在用於執行同步的相同對象上調用。

假設這,當客戶端1調用lock.wait()時,同步塊上的監視器被釋放。這意味着客戶端2可以訪問該方法並最終以相同的等待方法阻止。當其他線程在MyServer的同一實例上調用notify()時,wait()將釋放。

至於序列化,這發生在此方法被調用之前。它會發生在調用此方法的RMI代碼中。

+0

'Thread.wait()'的確是一種方法,但它是從'Object.wait()'繼承的,當然是錯誤的調用。 – EJP 2017-07-05 03:37:37

1

bar參數在請求調用foo方法的請求中發送,該請求是RMI協議的一部分。