2011-07-26 48 views
2

我剛開始使用Java RMI編程,我在我的代碼面臨以下問題:Java RMI的僵局

我的服務器有其一般實現了兩個遠程方法如下:

public class ServerImpl extends UnicastRemoteObject implements Server{ 
     .... 
     Synchronized void foo(){ aClient.Foo3();} 
     Synchronized void foo1(){ .... } 
} 

我的客戶有一個遠程方法,實現如下:

public class ClientImpl extends UnicastRemoteObject implements Client{ 
     .... 
     void Foo3(){theServer.foo1();} 
} 

所以當aClient調用服務器的FOO(),服務器調用客戶端的Foo3(),然後aClient要調用SERV呃的foo1()和我們有一個死鎖(服務器和客戶端都沒有移動)。我知道這是由於Synchronized關鍵字引起的。問題是這些方法必須是Synchronized的(我不希望兩個線程同時在那裏),並且我沒有絲毫的想法來解決這個問題。任何幫助讚賞。

非常感謝!

回答

3

您可以在每個方法內使用帶有不同鎖定對象的同步塊。​​鎖定方法this因此一次只能訪問一個。

1

當您在RMI中進行客戶端回調時,它會在調用執行回調的服務器RMI方法的線程的不同線程上調用。因此,如果回調方法在服務器上調用另一個同步方法,那麼我們有一個死鎖,因爲你已經在服務器上了。因此,如果所有方法調用都是本地而不是遠程,則同步(...)可能會導致死鎖。您需要使同步更加細化:在需要它的實際內部對象上進行同步,而不是通過同步方法在RMI服務器對象本身上進行同步。