code: @Override
      public void notifyChange() throws CouldNotPerformException, InterruptedException {
          synchronized (LISTENER_LOCK) {
              ExceptionStack exceptionStack = null;
              for (ChangeListener listener : listeners) {
                  try {
                      listener.notifyChange();
                  } catch (CouldNotPerformException ex) {
                      exceptionStack = MultiException.push(listener, ex, exceptionStack);
                  }
              }
              MultiException.checkAndThrow(() ->"Could not notify all listeners about the change!", exceptionStack);
          }
      }
docs: Method can be used to inform all registered listeners about a change.
  <p>
  Note: In case one listener could not be notified, the others will still be informed about the change and the exception in thrown afterwards.
  
  @throws CouldNotPerformException is returned if the notification has failed for some listeners.
  @throws InterruptedException     is thrown if the thread was externally interrupted.