为什么Observable类中的方法是同步的?

时间:2019-05-23 18:08:16

标签: java timer

为什么Observable类中的方法是同步的?

echo

2 个答案:

答案 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开始就已弃用。