threadsafe如何是EventListenerList?

时间:2011-07-19 21:04:26

标签: java multithreading events event-handling

Javadoc for EventListenerLists表示他们提供“一定程度的MT安全性(正确使用时)”。那是什么意思?我看到制作阵列的副本可以保护你在射击时不会让自己移除,所以在什么情况下这会失败?

更具体地说,我正在尝试构建一个EventBus来简化多线程应用程序中一些日益复杂的事件传递。我担心如果多个线程试图触发/响应事件会发生什么,我也害怕使用阻塞机制强制执行安全性,因为我的线程的一点是阻止我的UI阻止昂贵的任务。

1 个答案:

答案 0 :(得分:3)

它不是非常安全的。 :-((基于代码的OpenJDK 6 version。)

他们做得对的事情:

  1. addremove方法标记为synchronized,因此拨打一个方法不会与另一方的呼叫同时发生
  2. 永远不会修改侦听器列表数组; addremove始终将新数组分配给listenerList
  3. 他们做错的事(不幸的是):

    1. listenerList字段不是volatile
    2. getListenerList()方法不是synchronized
    3. 这意味着,如果您在一个线程中调用addremove,然后在另一个线程中调用getListenerList,则可能无法观察到更改,并且您仍可以返回旧版本的监听器列表。