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做同步,带来巨大的性能开销。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值