EventListenerList是如何线程安全的



EventListenerLists的Javadoc说它们提供了"一定程度的MT安全性(当正确使用时)"。这是什么意思?我知道复制数组可以保护你在射击时不会有东西自动移除,那么在什么情况下会失败呢?

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

这不是线程安全的。:-((基于OpenJDK 6版本的代码)

他们做对的事:

  1. addremove方法标记为synchronized,因此调用其中一个方法不会同时调用另一个方法
  2. 监听列表数组永远不会被修改;addremove总是给listenerList分配一个新的数组

他们做错的事情(不幸的):

  1. listenerList字段不是volatile
  2. getListenerList()方法不是synchronized

这意味着,如果您在一个线程中调用addremove,然后在另一个线程中调用getListenerList,则可能无法观察到更改,并且您可能仍然会返回旧版本的侦听器列表。

相关内容

  • 没有找到相关文章

最新更新