Consider the following code snippet:
private List<Listener<E>> listenerList = new CopyOnWriteArrayList<Listener<E>>();
public void addListener(Listener<E> listener) {
if (listener != null) {
listenerList.add(listener);
}
}
public void removeListener(Listener<E> listener) {
if (listener != null) {
listenerList.remove(listener);
}
}
protected final void fireChangedForward(Event<E> event) {
for (Listener<E> listener : listenerList) {
listener.changed(event);
}
}
protected final void fireChangedReversed(Event<E> event) {
final ListIterator<Listener<E>> li = listenerList.listIterator(listenerList.size());
while (li.hasPrevious()) {
li.previous().changed(event);
}
}
There is a listener list that can be modified and iterated. I think the forward iteration (see method #fireChangedForward) should be safe. The question is: is the reverse iteration (see method #fireChangedReversed) also safe in a multi-threaded environment? I doubt that, because there are two calls involved: #size and #listIterator. If it's not thread-safe, what is the most efficient way to implement #fireChangedReversed under the following circumstances:
- optimize for traversal
- avoid usage of locking if possible
- avoid usage of javax.swing.event.EventListenerList
- prefer solution without usage of third-party lib, e.g. implementation in own code possible