`
zj05409
  • 浏览: 1937 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

JDK中Observer类的陷阱

阅读更多
JDK基础API对观察者模式提供了内建的支持。
在观察者模式中,被观察的对象继承java.util.Observer,观察者实现java.util.Observer接口。
首先观察者通过Observable.addObserver(Observer o)方法被添加到被观察对象的事件监听器列表中,然后当特定事件发生时调用Observable.notifyObservers(Object arg)方法来触发监听器逻辑,Observable会相应地调用每个观察者的Observer.update(Observable o, Object arg)方法,执行相应的逻辑。
在调用Observable.notifyObservers(Object arg)之前,必须先电泳Observable.setChanged()来将一个Observable中的实例状态变量changed设置为true,否则观察者的update方法不会被执行。
而Observable.notifyObservers(Object arg)之中,调用观察者逻辑之前,会调用clearChanged()方法将changed设置为false。这样的话,如果当时有并发的另外的线程调用notifyObservers方法,那么其事件处理逻辑就不会被执行。
我最后采取的解决方法是在子类中将Observer的clearChanged()方法覆盖为空实现,不再将changed设置为false。这样就不需要使用synchronize做同步,带来巨大的性能开销。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics