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

我正在做这样的事情:

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[],然后在每次事件触发时都进行同步,而无需进行同步,就很容易了。我现在要进行更改,然后看看这里是否有更好的主意。

最佳答案

请改用CopyOnWriteArrayList。可以观察到,侦听器列表的检查通常比对其进行修改的频率要高得多。

07-28 00:46