【问题标题】:java rmi deadlockjava rmi 死锁
【发布时间】:2011-07-26 12:05:33
【问题描述】:

我刚刚开始使用 java rmi 进行编程,但在我的代码中遇到了以下问题:

我的服务器有两个 Remote 方法,一般实现如下:

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 关键字引起的。问题是这些方法必须同步(我不希望两个线程同时在那里),而且我对如何解决这个问题一无所知。任何帮助表示赞赏。

非常感谢!

【问题讨论】:

标签: java synchronization rmi deadlock


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当您在 RMI 中有客户端回调时,它会在与调用执行回调的服务器 RMI 方法的线程不同的线程上被调用。因此,如果回调方法随后在服务器上调用另一个同步方法,我们就会出现死锁,因为您已经在服务器上。

    所以synchronized 可能会导致死锁,如果所有方法调用都是本地的而不是远程的,则不会出现这种死锁。您需要使您的同步更加细粒度:在需要它的实际内部对象上进行同步,而不是通过同步方法在 RMI 服务器对象本身上进行同步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多