java为什么可观察类中的方法是同步的?
为什么Observable类中的方法是同步的
public synchronized void deleteObserver(Observer o) {
obs.removeElement(o);
}
你可以在下面搜索框中键入要查询的问题!
为什么Observable类中的方法是同步的
public synchronized void deleteObserver(Observer o) {
obs.removeElement(o);
}
# 1 楼答案
关于为什么
Observable
是这样实现的,我不能给你一个明确的答案,但我可以解释它的效果虽然
Vector
是一个同步的集合,但它在迭代时不同步。这类似于Collections.synchronizedXXX
方法返回的包装器。为了在并发上下文中安全地迭代Vector
,您需要外部同步。他们通过使用synchronized
方法来实现这一点。但是如果您查看notifyObservers
,您将看到该方法没有同步。但是,如果您查看notifyObservers
的主体,您将看到一个synchronized(this) {}
块。他们这样做是因为持有锁时只需要执行方法体的一部分。如果您不知道,synchronized
实例方法与对整个方法使用synchronized(this) {}
相同使用
synchronized
方法引起的另一个影响是obs
字段和changed
字段都由同一个锁保护。这使这两个字段之间的状态在多线程环境中保持一致。我不知道他们为什么选择封闭实例作为锁,但他们就是这么做的注意,就我所知,
Observable
类在其文档中没有提供关于线程安全的保证。这意味着它是线程安全的,这是一个实现细节还请注意
Observable
自Java9以来一直被弃用# 2 楼答案
Observable
是一个非常线程安全的类;它“原子地”处理共享数据,这意味着一次只有一个线程可以访问它。synchronized
关键字强制每个交互线程以原子方式访问Observable
实例的数据请注意,某些方法,例如
notifyObservers()
,不是synchronized
。这是因为它们不会直接影响Observable
的实例数据如果您想了解有关线程安全的更多信息,请阅读this writeup