每次触发侦听器时,我的侦听器实现是否会创建一个新数组?

时间:2011-05-06 18:05:56

标签: java multithreading synchronization listener

我的设计中有一个有听众的对象。这些侦听器会因某个事件被触发,该事件每秒可能发生多达一百次。

我做的是这样的事情:

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[],然后只要每次事件触发时都进行迭代而不进行同步。我现在要做出改变,然后看看这里是否有更好的想法。

1 个答案:

答案 0 :(得分:6)

请改用CopyOnWriteArrayList。观察结果是,听众列表的检查频率通常比修改后更多。