use thread-safe list for listeners