我应该同步notifyObservers调用吗?

问题描述:

我发现这个实现的可观察:我应该同步notifyObservers调用吗?

public class ObservableObject extends Observable { 
    private static ObservableObject instance = new ObservableObject(); 

    public static ObservableObject getInstance() { 
     return instance; 
    } 

    private ObservableObject() { 
    } 

    public void updateValue(Object data) { 
     synchronized (this) { 
      // The call to setChanged marks this Observable object as having been changed; the hasChanged method will now return true. 
      setChanged(); 
      notifyObservers(data); 
     } 
    } 
} 

我试图了解是什么在default implementation使用synchronized块,并在我上面找到的代码使用synchronized块之间的区别,是否需要这两种?有没有更好的(正确)方法?

+0

我相信没有比锁定同一对象的其它区别两次,因为默认的实现使用可观察的实例来获取锁和类'ObservableObject'是'Observable',在这两种情况下,当前'ObservableObject'的子类实例将被锁定 – ManZzup

+0

@ManZzup默认实现锁定数据,因为给定的实现锁定在其自身 – dosdebug

你不应该叫在持有锁的notifyObservers。由于链接代码评论中引用的原因,发布的代码有缺陷:

我们不希望观察者在持有自己的监视器时进行任意代码回调。我们从Vector中提取每个Observable并存储Observer状态的代码需要同步,但通知观察者不会(不应该)。这里任何潜在的竞争条件的最坏的结果就是:

1)新添加的观察者会错过正在进行

2)最近未登记的观察员将错误通知的通知时,它并不关心

方法notifyObservers包括更新观察者的调用,java.util.Observable代码很小心地离开它,使其不同步。如果观察者在更新观察者时拥有自己的锁定,但观察者无法控制观察者所做的事情,则无法确定锁定可持续多久,从而影响可观察者的响应。

+0

谢谢,你的解释帮助。 –