2011-07-26 50 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服务器对象本身上进行同步。