沙漠中的鱼

欲上天堂,先下地狱
posts - 0, comments - 56, trackbacks - 0, articles - 119
  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理

做个好的(事件)侦听器笔记

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() 方法的所有出口都会执行它。

只有注册用户登录后才能发表评论。


网站导航: