2011-05-06 18 views
3

我的设计中有一个对象具有侦听器。这些听众被某个事件触发,每秒可能发生多达一百次。每次侦听器被触发时,我的侦听器实现是否正在创建一个新数组,这是否是一个问题?

我在做这样的事情:

private void notifyListeners(ObjectEvent o) { 
    synchronized (this.listeners) { 
     for (ObjectListener l: this.listeners) 
      l.eventFired(o); 
    } 
} 

这里的问题是,有人可以实现一个eventFired方法,然后转身等待synchronize向被正在举行的一个不同的线程是一个对象试图添加或删除一个监听器并等待synchronized(this.listeners)行。

所以,我修改了notifyListeners方法正是如此:

private ObjectListener[] getObjectListeners() { 
    synchronized (this.listeners) { 
     return this.listeners.toArray(new ObjectListener[this.listeners.size()]); 
    } 
} 

private void notifyListeners(ObjectEvent o) { 
    ObjectListener[] listeners = this.getObjectListeners(); 
    for (ObjectListener l: listeners) 
     l.eventFired(o); 
} 

我担心每次对象点火时间创建此数组的影响,以及影响这将会对的内存使用情况应用。

所以我在这里问是否有更好的方法。不过,我可能刚刚找到它。每次添加或删除侦听器时创建ObjectListener[]都会非常容易,然后只需在事件触发时不进行同步即可迭代。我现在要做出改变,然后看看这里提供了更好的主意。

回答

6

改为使用CopyOnWriteArrayList。观察结果是,听众列表通常比修改更频繁地被检查。

相关问题