Posted on 2009-04-27 18:22
沙漠中的鱼 阅读(233)
评论(0) 编辑 收藏 所属分类:
Java基础
事件监听的安全性
如下代码,在用Vector进行不安全的迭代时,另外一个线程对Vector的对象进行添加或删除时,会抛出会抛出 ConcurrentModificationException异常。
Vector<Listener> v;
for (int i=0; i<v.size(); i++)
v.get(i).eventHappened(event);
java.util.concurrent 中的 CopyOnWriteArrayList 类,能够帮助防止这个问题。它实现了 List,而且是线程安全的,但是它的迭代器不会抛出 ConcurrentModificationException,遍历期间也不要求额外的锁定。这种特性组合是通过在每次列表修改时,在内部重新分配并拷贝列表内容而实现的,这样,遍历内容的线程不需要处理变化 —— 从它们的角度来说,列表的内容在遍历期间保持不变。虽然这听起来可能没效率,但是请记住,在多数观察者情况下,每个组件只有少量侦听器,遍历的数量远远超过插入和删除的数量。所以更快的迭代可以补偿较慢的变化过程,并提供更好的并发性,因为多个线程可以同时迭代列表。
事件监听初使化风险
事件监听器允许"this"转义
失效的监听
public void processFile(String filename) throws IOException {
cancelButton.registerListener(this);
// open file, read it, process it
// might throw IOException
cancelButton.unregisterListener(this);
}
当读入文件时,产生异常,会造成取消注册事件不能被执行,取消登记的操作应当在 finally 块中进行,这样,processFile() 方法的所有出口都会执行它。