我刚刚开始使用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
,因此一次只能访问一个。