Estoy luchando con una decisión. Estoy escribiendo una biblioteca/API segura para subprocesos. Los oyentes pueden registrarse, por lo que se notifica al cliente cuando sucede algo interesante. ¿Cuál de las dos implementaciones es la más común?notificar oyente dentro o fuera de la sincronización interna
class MyModule {
protected Listener listener;
protected void somethingHappens() {
synchronized(this) {
... do useful stuff ...
listener.notify();
}
}
}
o
class MyModule {
protected Listener listener;
protected void somethingHappens() {
Listener l = null;
synchronized(this) {
... do useful stuff ...
l = listener;
}
l.notify();
}
}
En la primera aplicación, el oyente se notifica dentro de la sincronización. En la segunda implementación, esto se hace fuera de la sincronización.
Creo que el segundo es aconsejable, ya que deja menos espacio para bloqueos potenciales. Pero estoy teniendo problemas para convencerme a mí mismo.
Una desventaja de la segunda imlementación es que el cliente puede recibir notificaciones 'incorrectas', lo que sucede si accede y cambia el módulo antes de la instrucción l.notify(). Por ejemplo, si le pide al módulo que deje de enviar notificaciones, esta notificación se envía de todos modos. Este no es el caso en la primera implementación.
muchas gracias
Gracias por su respuesta. Intencionalmente no menciono la parte de suscripción/desuscripción. Quiero suponer que hay un oyente fijo. Mi pregunta es más bien si es aconsejable exponer la sincronización fuera de la clase o no. –
@Jary Zeels, ver las adiciones a la respuesta –
Gracias Adrian por su aclaración, lo entiendo ahora. La situación con un oyente es clara para mí. Voy a pensar en la situación en la que se pueden registrar más oyentes, porque entonces, la reincorporación puede ser un problema. No desea que los eventos se entreguen en el orden incorrecto cuando, por ejemplo, uno de los oyentes notificados hace algo que desencadena una nueva notificación. Lo pensaré y volveré con más preguntas si es necesario. Gracias de nuevo. –