【问题标题】:When a listener is removed, is it okay that the event be called on that listener one more time?当一个监听器被移除时,是否可以在该监听器上再次调用该事件?
【发布时间】:2011-11-24 16:40:53
【问题描述】:

大多数人使用 ConcurrentLinkedQueue 或 CopyOnWriteArrayList 来收集侦听器并在发生某些事情时通知他们。这样做的缺点是,侦听器可能会在自己注销时收到通知。如果管理器(集合,...,给它一个名称)正在迭代侦听器的集合,并且某个侦听器在该迭代期间取消注册自己,则会发生这种情况。

因此,“删除侦听器”合同已失效。你会认为这是一个问题吗?

【问题讨论】:

  • 合同不一定是违约的。只是监听器被移除后会再收到一个事件。
  • 更正:监听器可能在 is 被移除后会再收到一个事件。只有当侦听器在迭代侦听器列表时不幸被移除时,才会发生这种情况。
  • 如果侦听器在该迭代期间取消注册自己,它如何接收另一个事件?除非对未修改的集合有另一个迭代?
  • @EJP 回答您的问题:“它不能”和“是”。 (顺便说一句:这是 OP 提出的原始问题:stackoverflow.com/questions/8259479/…
  • @EJP 如果侦听器是#8,并且它在事件被触发并在通知#3 的过程中注销自己,那么它会再收到一个事件通知。

标签: java listener


【解决方案1】:

即使您检查了侦听器是否仍然已注册,但在多线程环境中,您仍然无法确定在您调用它时它是否仍然已注册。即使对于非多线程情况,标准实现也是在副本上工作。

【讨论】:

  • 所以由监听器实现来过滤迟来的事件?
  • @JaperD 因为没有其他人可以......是的。
  • 是的,如果这对监听器实现来说是个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多