java - 为什么 wait() 和 notify() 不在特殊类中?

标签 java wait notify

<分区>

为什么是wait , notifynotifyAll方法放在 Object , 不在某个单独的类(class)?

请注意,这个问题不是要将它们移动到 Thread类,我只是想知道为什么他们乱扔垃圾 Object , 不是一些新的 Monitor类。

我看到了这个想法的以下缺点:

  • 我们将无法将我们的其他用途字段用作监视器。但这似乎符合模块化原则。
  • 同步方法现在需要对生成的隐藏字段进行一些修改(如在闭包中),如 this<MyClass>.class成为无效的监视器。

所以我们可以从每个对象中移除 5 个方法,但有点遗憾。还是不行?

最佳答案

真正的答案是这是一个错误,最终通过创建 Condition 得到承认。类,它完全符合您的期望。 (尽管因为它是一个对象,所以您可能会不小心对其调用 wait() 而不是 await(),从而导致滑稽的后果。 ..)

除了您已经列出的内容之外,将监视器绑定(bind)到每个对象也使得在 Java 中不可能拥有真正不可变的对象。

所以你可以这样做,例如:

class A {
   void foo() {
      synchronized((Integer)42) {
         ...
      }
   }
}

class B {
   void foo() {
      synchronized((Integer)42) { 
          ...
      }
   }
}

如果对象是不可变的,则每次为 42 返回相同的装箱整数应该不是问题。但它不是,它有一个可变状态:它的监视器,使这种同步成为可能。其中特别糟糕的是,您在两段代码之间创建了一个互斥量,而这两条代码表面上看起来是独立的。

关于java - 为什么 wait() 和 notify() 不在特殊类中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35431453/

相关文章:

java - 通过多个类加载器获取的类实例

java - Layer2 中的签名外观字体颜色(itext 7)

angular - 等待异步函数返回 Typescript 中的值。

C#如何等待代理ping?

子进程不会在 C 程序中死亡

paypal-ipn - 如何使用 NVP 方法 (CreateRecurringPaymentsProfile) 设置 PayPal 定期付款的 IPN URL?

java - com.facebook.FacebookException : could not construct request body

java - JBOSS AS 7 上的 SSL

java - 如何让单个线程而不是整个程序等待?

Java notify() 在 wait() 之前被调用