我的设计中有一个带有侦听器的对象。这些侦听器因某个事件而被解雇,该事件每秒可能发生多达一百次。
我正在做这样的事情:
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。可以观察到,侦听器列表的检查通常比对其进行修改的频率要高得多。