java rmi тупик - PullRequest
       35

java rmi тупик

2 голосов
/ 26 июля 2011

Я только начал программировать с использованием 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.Проблема в том, что эти методы должны быть синхронизированы (я не хочу, чтобы там было два потока одновременно), и у меня нет ни малейшего представления о том, как решить эту проблему.Любая помощь приветствуется.

Большое спасибо!

Ответы [ 2 ]

3 голосов
/ 26 июля 2011

Вы можете использовать синхронизированный блок с различными объектами блокировки внутри каждого метода.synchronized методы блокируются на this, поэтому за один раз можно посетить только один.

1 голос
/ 27 июля 2011

Когда у вас есть обратный вызов клиента в RMI, он вызывается в другом потоке, чем поток, который вызвал метод RMI сервера, который сделал обратный вызов.Таким образом, если метод обратного вызова затем вызывает другой синхронизированный метод на сервере, мы заходим в тупик, потому что вы уже в одном на сервере.Таким образом, synchronized (...) может вызвать тупик, который не возник бы, если бы все вызовы методов были локальными, а не удаленными.Вы должны сделать свою синхронизацию более детальной: синхронизировать на фактических внутренних объектах, которые нуждаются в этом, а не на самом объекте сервера RMI через синхронизированные методы.

...