This violates the equals contract. You need to do this:

    @Override
    public boolean equals(Object other) {
      if (this == other) return true;
      if ( !(other instanceof SynchronizedRunListener) ) return false;
      SynchronizedRunListene that = (SynchronizedRunListene) other;
      return this.listener.equals(that.listener);
    }