public class ParallelListenerList<T>
This is like ListenerList but several events can be firing simultaneously
in several threads. ListenerList synchronizes on the list itself meaning that
another event will not start processing until the previous one is done, this class
avoids that problem by using a different locking mechanism.
This somewhat obfuscates the behaviour of modifying the list while events are
firing. Changes are still gathered into a separate changes list but those
changes are not processed until all currently firing events have finished.
If the changes list is not empty, processing of new events will wait until the
changes list has been cleared.