punto muerto de java rmi
synchronization deadlock (2)
Acabo de comenzar a programar con java rmi y me encuentro con el siguiente problema en mi código:
Mi servidor tiene dos métodos remotos que se implementan en general de la siguiente manera:
public class ServerImpl extends UnicastRemoteObject implements Server{
....
Synchronized void foo(){ aClient.Foo3();}
Synchronized void foo1(){ .... }
}
Mis clientes tienen un método remoto que se implementa de la siguiente manera:
public class ClientImpl extends UnicastRemoteObject implements Client{
....
void Foo3(){theServer.foo1();}
}
Entonces, cuando aClient llama a foo () del servidor, el servidor llama a Foo3 () del cliente y luego aCliente quiere llamar a foo1 () del servidor y tenemos un punto muerto (ni el servidor ni el cliente se mueven). Sé que esto se debe a la palabra clave Sincronizada. El problema es que estos métodos tienen que estar sincronizados (no quiero dos hilos al mismo tiempo), y no tengo la menor idea de cómo resolver este problema. Cualquier ayuda apreciada.
¡Muchas gracias!
Puede usar un bloque sincronizado con diferentes objetos de bloqueo dentro de cada método. synchronized
métodos synchronized
bloquean para que solo se pueda visitar uno a la vez.
Cuando tiene una devolución de llamada del cliente en RMI, se invoca en un subproceso diferente del subproceso que invoca el método de RMI del servidor que realizó la devolución de llamada. Entonces, si el método de devolución de llamada llama a otro método sincronizado en el servidor, tenemos un punto muerto, porque ya está en uno en el servidor. Por lo tanto, sincronizado (...) puede causar un interbloqueo que no surgiría si todas las llamadas al método fueran locales en lugar de remotas. Necesita sincronizar su sincronización: sincronice en los objetos internos reales que lo necesitan, en lugar de hacerlo en el objeto del servidor RMI a través de métodos sincronizados.