Когда слушатель удаляется, можно ли вызывать событие на этом слушателе еще раз? - PullRequest
2 голосов
/ 24 ноября 2011

Большинство людей используют ConcurrentLinkedQueue или CopyOnWriteArrayList для сбора слушателей и уведомления их, когда что-то происходит. Недостатком этого является то, что возможно, что слушатель может получить уведомление, когда он уже сам не зарегистрирован. Это происходит, если менеджер (collection, ..., присваивает ему имя) перебирает коллекцию слушателей, а какой-то слушатель отменяет регистрацию во время этой итерации.

Итак, контракт на удаление слушателя нарушен. Считаете ли вы это проблемой?

1 Ответ

4 голосов
/ 24 ноября 2011

Даже если вы проверили, что прослушиватель все еще зарегистрирован, в многопоточном окружении вы все равно не могли быть уверены, что он все еще был зарегистрирован к моменту его вызова.Даже для не многопоточных ситуаций стандартная реализация - работать с копией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...