2011-11-24 175 views
2

大多數人使用ConcurrentLinkedQueue或CopyOnWriteArrayList來收集偵聽器,並在事件發生時通知他們。這樣做的缺點是,聽衆可能會在自己已經註銷時收到通知。如果經理(集合,...,給它一個名字)遍歷監聽器集合,並且某個監聽器在該迭代期間取消註冊,則會發生這種情況。當偵聽器被移除時,是否可以再次在該偵聽器上調用該事件?

因此,'刪除監聽者'合同被打破。你會認爲這是一個問題嗎?

+2

合同不是一定要破的。只是聽衆在移除後會收到一個事件。 – Michael

+0

更正:偵聽器*在拆除後可能會再收到一個事件。只有在偵聽器迭代完成時,如果偵聽器不幸被移除,纔會發生這種情況。 – Michael

+0

如果偵聽器在該迭代過程中未註冊自己,它如何接收另一個事件?除非對未經修改的集合有另一個*迭代? – EJP

回答

4

即使您檢查了偵聽器仍被註冊,但在多線程環境中,您仍然無法確定它在您調用它時仍然被註冊。即使對於非多線程的情況,標準實現也是在副本上工作。

+0

因此,由聽衆實施來篩選即將到來的事件呢? –

+1

@JaperD因爲沒有人可以..是的。 – Voo

+0

是的,如果這將是一個監聽器實現的問題。 –