为什么Observable类中的方法是同步的?
echo
答案 0 :(得分:1)
Observable
是一个非常线程安全的类;它以“原子”方式操纵共享数据,这意味着一次只能有一个线程可以访问它。 synchronized
关键字强制每个交互线程以原子方式访问Observable
实例的数据。
synchronized
方法提供了一种防止线程干扰和内存一致性错误的简单策略:如果一个对象对一个以上的线程可见,则对该对象变量的所有读或写都通过同步方法完成。
请注意,某些方法,例如notifyObservers()
不是synchronized
。这是因为它们不会直接影响Observable
的实例数据。
如果想了解有关线程安全性的更多信息,请阅读this writeup。
答案 1 :(得分:0)
我无法就为什么 Observable
的实现方式给出确切的答案,但是我可以解释其效果。
尽管Vector
是一个同步的集合,但在迭代时它并不同步。这类似于Collections.synchronizedXXX
方法返回的包装器。为了在并发上下文中安全地迭代Vector
,您需要外部同步。他们使用synchronized
方法来完成此任务。但是,如果您查看notifyObservers
,则会发现该方法未同步。但是,如果您查看notifyObservers
的正文,则会看到一个synchronized(this) {}
块。他们这样做是因为在持有锁的同时只需要执行方法主体的一部分。如果您不知道,synchronized
实例方法与整个方法使用synchronized(this) {}
相同。
使用synchronized
方法引起的另一个影响是obs
字段和changed
字段都由同一锁保护。在多线程环境中,这可以使这两个字段之间的状态保持一致。他们为什么选择封闭的实例作为锁,我不知道,但这就是他们所做的。
请注意,就我所知,Observable
类在其文档中没有关于线程安全的保证。这意味着它是线程安全的,这是一个实现细节。
还请注意,Observable
自Java 9开始就已弃用。