Java.util.Observable是线程安全的吗?

9
在Java的观察者模式中,类Observer和Observable会调用Observable对象的notifyObservers(Object arg0)方法。如果在不同的线程中进行调用,这个方法是否是线程安全的呢?
例如:我有多个线程,都是Observable,它们经常会调用notifyObservers(...)方法。而这些线程都向单个Observer对象报告。
那么,我是否会遇到并发问题呢?还有什么更好的解决方法呢?我知道可以使用事件监听器来解决。但是我不确定如何实现它,并且如果可能的话,我希望坚持使用观察者模式的实现。

http://stackoverflow.com/questions/5123121/is-java-util-observable-in-android-thread-safe - Mob
谢谢,我没有看到那个,但它似乎并没有回答这个问题,也没有给出任何提示如何找到答案。这是针对普通的Java实现。 - Vort3x
尝试反编译您正在使用的Java发行版中的Observable对象。 - DwB
@Angel;我确实查看了,但没有提到同步或线程安全。 - Vort3x
好的,如果方法没有在 Java Doc 中标记为 "synchronized",那么它就不是真正的线程安全。 - Angel O'Sphere
那么Java实现线程安全的唯一方式就是使用同步方法语句吗?我不太确定。 - Vort3x
1个回答

7

从源代码(我有Java 5源代码,但Java 6和7应该是相同的)来看,似乎只有在Observable本身上进行同步。

notifyObservers(...)方法(在Observable中):

synchronized (this) {
  //the observers are notified in this block, with no additional synchronization
}

因此,如果Observer没有更改任何共享数据,则应该没有问题。如果它更改了共享数据 - 您可能会有多个对具有不同Observableupdate(Observable,Object)的调用 - 您需要自行在共享数据上添加同步。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接