有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (2) 个答案

  1. # 1 楼答案

    关于为什么Observable是这样实现的,我不能给你一个明确的答案,但我可以解释它的效果

    虽然Vector是一个同步的集合,但它在迭代时不同步。这类似于Collections.synchronizedXXX方法返回的包装器。为了在并发上下文中安全地迭代Vector,您需要外部同步。他们通过使用synchronized方法来实现这一点。但是如果您查看notifyObservers,您将看到该方法没有同步。但是,如果您查看notifyObservers的主体,您将看到一个synchronized(this) {}块。他们这样做是因为持有锁时只需要执行方法体的一部分。如果您不知道,synchronized实例方法与对整个方法使用synchronized(this) {}相同

    使用synchronized方法引起的另一个影响是obs字段和changed字段都由同一个锁保护。这使这两个字段之间的状态在多线程环境中保持一致。我不知道他们为什么选择封闭实例作为锁,但他们就是这么做的

    注意,就我所知,Observable类在其文档中没有提供关于线程安全的保证。这意味着它是线程安全的,这是一个实现细节

    还请注意Observable自Java9以来一直被弃用

  2. # 2 楼答案

    Observable是一个非常线程安全的类;它“原子地”处理共享数据,这意味着一次只有一个线程可以访问它。synchronized关键字强制每个交互线程以原子方式访问Observable实例的数据

    synchronized methods enable a simple strategy for preventing thread interference and memory consistency errors: if an object is visible to more than one thread, all reads or writes to that object's variables are done through synchronized methods.

    请注意,某些方法,例如notifyObservers(),不是synchronized。这是因为它们不会直接影响Observable的实例数据

    如果您想了解有关线程安全的更多信息,请阅读this writeup