ich Singletons Thread-Klasse haben, die manchmal Funktion aufruft unten und benachrichtigt Zuhörer von ihm Thread run()
Methode ist:Legendes Anmeldern auf Zuhörer synchronisiert
public class Serial implements Runnable
{
private ArrayList observers = new ArrayList();
...
public void run()
{
notifyListeners(new CS());
}
public synchronized void notifyListeners(CS value)
{
log.debug("notifying listeners with Control ");
int os = observers.size();
for (int i = 0; i < observers.size(); i++)
{
MListener observer = (MListener) observers.get(i);
observer.dataReceived(value);
}
}
...
public void addListener(MListener lsn)
{
observers.add(lsn);
}
public void removeListener(MListener lsn)
{
observers.remove(lsn);
}
}
Ich frage mich nur, was synchronized
auf notifyListeners
Methode gibt? Einer der Gründe - nicht erlauben hinzufügen/entfernen Beobachter von/zu ArrayList observers
während notifyListeners
aufgerufen wird. Bitte korrigieren Sie mich, falls ich falsch liege. Was könnte es noch geben?
UPD
Ich habe meinen Code mit zwei Methoden aktualisiert addListener
und removeListener
. Ich nehme an, es ist ein Fehler, da beide Methoden nicht synchronized
sind und von einem anderen Thread aufgerufen werden könnten?
Ich empfehle, das [Multicaster-Muster] (https://docs.oracle.com/javase/8/docs/api/java/awt/AWTEventMulticaster.html) zu betrachten, das die Nichteinmischung während der Ereignislieferung ohne die Sie müssen die Listener-Liste kopieren oder die gesamte Operation synchronisieren. Es ist viel effizienter, besonders für eine kleine Anzahl von Zuhörern. Schauen Sie sich [den Quellcode] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/awt/AWTEventMulticaster.java#AWTEventMulticaster) an, um herauszufinden, wie man es für andere Event-/Listenertypen implementiert ... – Holger