为什么是wait
, notify
和 notifyAll
方法放在 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
返回相同的装箱整数应该不是问题。但它不是,它有一个可变状态:它的监视器,使这种同步成为可能。其中特别糟糕的是,您在两段代码之间创建了一个互斥量,而这两条代码表面上看起来是独立的。