Ich habe mit einer Entscheidung zu kämpfen. Ich schreibe eine thread-sichere Bibliothek/API. Listener können registriert werden, sodass der Client benachrichtigt wird, wenn etwas Interessantes passiert. Welche der beiden Implementierungen ist am häufigsten anzutreffen?Benachrichtigen Hörer innerhalb oder außerhalb der inneren Synchronisation
class MyModule {
protected Listener listener;
protected void somethingHappens() {
synchronized(this) {
... do useful stuff ...
listener.notify();
}
}
}
oder
class MyModule {
protected Listener listener;
protected void somethingHappens() {
Listener l = null;
synchronized(this) {
... do useful stuff ...
l = listener;
}
l.notify();
}
}
In der ersten Implementierung wird der Zuhörer in der Synchronisation benachrichtigt. In der zweiten Implementierung erfolgt dies außerhalb der Synchronisation.
Ich glaube, dass der zweite empfohlen wird, da es weniger Platz für potenzielle Deadlocks bietet. Aber ich habe Schwierigkeiten, mich zu überzeugen.
Ein Nachteil der zweiten Implementation ist, dass der Client "inkorrekte" Benachrichtigungen erhalten kann, was passiert, wenn das Modul vor der l.notify() Anweisung aufgerufen und geändert wurde. Wenn beispielsweise das Modul aufgefordert wurde, keine Benachrichtigungen mehr zu senden, wird diese Benachrichtigung trotzdem gesendet. Dies ist bei der ersten Implementierung nicht der Fall.
Dank viel
Danke für Ihre Antwort. Ich erwähne absichtlich nicht den Subskribierungs-/Abmeldepart. Ich möchte annehmen, dass es einen festen Zuhörer gibt. Meine Frage ist eher, wenn es sinnvoll ist, die Synchronisation außerhalb der Klasse zu offenbaren oder nicht. –
@Jary Zeels, siehe Ergänzungen zu beantworten –
Danke Adrian für Ihre Klarstellung, ich verstehe es jetzt. Die Situation mit einem Zuhörer ist mir klar. Ich werde über die Situation nachdenken, wenn mehr Zuhörer registriert werden können, weil dann Wiedereintritt ein Problem sein kann. Sie möchten nicht, dass die Ereignisse in der falschen Reihenfolge übermittelt werden, wenn z. B. einer der angemeldeten Listener eine Aktion ausführt, die eine neue Benachrichtigung auslöst. Ich werde darüber nachdenken und bei Bedarf weitere Fragen stellen. Danke noch einmal. –