Sono in difficoltà con una decisione. Sto scrivendo una libreria/API thread-safe. Gli ascoltatori possono essere registrati, quindi il client viene avvisato quando succede qualcosa di interessante. Quale delle due implementazioni è più comune?notificare l'ascoltatore all'interno o all'esterno della sincronizzazione 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();
}
}
Nella prima realizzazione, l'ascoltatore è notificato all'interno della sincronizzazione. Nella seconda implementazione, questa operazione viene eseguita al di fuori della sincronizzazione.
Ritengo che la seconda sia consigliata, in quanto rende meno spazio a potenziali blocchi. Ma sto avendo problemi a convincere me stesso.
Uno svantaggio della seconda implementazione è che il client potrebbe ricevere notifiche "errate", il che accade se ha effettuato l'accesso e modificato il modulo prima dell'istruzione l.notify(). Ad esempio, se ha chiesto al modulo di interrompere l'invio di notifiche, questo notificaiton viene comunque inviato. Questo non è il caso della prima implementazione.
grazie mille
Grazie per la risposta. Intendo intenzionalmente non menzionare la parte di iscrizione/annullamento dell'iscrizione. Voglio supporre che ci sia un ascoltatore fisso. La mia domanda è piuttosto se è saggio esporre la sincronizzazione al di fuori della classe o meno. –
@Jary Zeels, vedere le aggiunte per rispondere allo –
Grazie Adrian per il chiarimento, lo capisco ora. La situazione con un ascoltatore mi è chiara. Penserò alla situazione in cui possono essere registrati più ascoltatori, perché in tal caso il re-entrancycan può essere un problema. Non si desidera che gli eventi vengano recapitati nell'ordine sbagliato quando, per esempio, uno degli ascoltatori notificati fa qualcosa che attiva una nuova notifica. Ci penserò e tornerò con altre domande se necessario. Grazie ancora. –