为什么 Observable 类中的方法是同步的?
public synchronized void deleteObserver(Observer o) {
obs.removeElement(o);
}
我不能给你一个明确的答案,说明为什么 Observable
以这种方式实施,但我可以解释它的效果。
WhileVector
是一个同步集合,它在迭代时不同步。这类似于Collections.synchronizedXXX
方法返回的包装器。为了Vector
在并发上下文中安全地迭代 a ,您需要外部同步。他们通过使用synchronized
方法来实现这一点。但是,如果您查看一下,notifyObservers
您会发现该方法并未同步。但是,如果您查看主体,notifyObservers
则会看到一个synchronized(this) {}
块。他们这样做是因为在持有锁时只需要执行方法体的一部分。如果您不知道,synchronized
实例方法与synchronized(this) {}
用于整个方法的方法相同。
使用synchronized
方法造成的另一个影响是obs
字段和changed
字段都被同一个锁保护。这使这两个字段之间的状态在多线程环境中保持一致。为什么他们选择封闭实例作为锁,我不知道,但这就是他们所做的。
请注意,就我所知,Observable
该类在其文档中不保证线程安全。这意味着它是线程安全的这一事实是一个实现细节。
另请注意,Observable
自 Java 9 以来已被弃用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句