Javadoc for EventListenerLists表示他们提供“一定程度的MT安全性(正确使用时)”。那是什么意思?我看到制作阵列的副本可以保护你在射击时不会让自己移除,所以在什么情况下这会失败?
更具体地说,我正在尝试构建一个EventBus来简化多线程应用程序中一些日益复杂的事件传递。我担心如果多个线程试图触发/响应事件会发生什么,我也害怕使用阻塞机制强制执行安全性,因为我的线程的一点是阻止我的UI阻止昂贵的任务。
答案 0 :(得分:3)
它不是非常安全的。 :-((基于代码的OpenJDK 6 version。)
他们做得对的事情:
add
和remove
方法标记为synchronized
,因此拨打一个方法不会与另一方的呼叫同时发生add
和remove
始终将新数组分配给listenerList
他们做错的事(不幸的是):
listenerList
字段不是volatile
getListenerList()
方法不是synchronized
这意味着,如果您在一个线程中调用add
或remove
,然后在另一个线程中调用getListenerList
,则可能无法观察到更改,并且您仍可以返回旧版本的监听器列表。