我刚刚开始使用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想要调用服务器的foo1()时,就会出现死锁(服务器和客户端都不会继续前进)。我知道这是由于Synchronized关键字引起的。问题在于这些方法必须同步(我不希望两个线程同时存在),而且我对如何解决此问题一无所知。任何帮助表示赞赏。

非常感谢你!

最佳答案

您可以在每个方法中使用带有不同锁定对象的同步块。 synchronized方法锁定this,因此一次只能访问一个。

10-02 03:35
查看更多