为什么Object.wait()是final的?

9
在Java中,Object的wait()方法为什么被实现为final方法呢?是否没有必要重写wait()方法呢?

19
它不仅是“最终”的,而且也是“本地化的”。它是那些需要在较低层次实现的方法之一。 - Sotirios Delimanolis
2个回答

4
Java语言规范描述了同步的工作原理。除了对象监视器等许多概念外,还有等待集合的概念。

每个对象除了具有关联的监视器外,还有一个关联的等待集合。等待集合是一组线程。

当对象首次创建时,其等待集合为空。将线程添加到等待集合和从等待集合中删除线程的基本操作是原子性的。等待集合仅通过方法Object.wait、Object.notify和Object.notifyAll进行操作

如果您能够重写该方法,可能会发现自己有一种打破同步的方式。Java不能允许这样做。它必须对确切的实现进行控制,这就是为什么它是final的原因。

1
我们在Java中从同步方法或同步块中调用wait()、notify()或notifyAll()方法,以避免以下情况发生:
  1. 在Java中发生IllegalMonitorStateException,如果我们不从同步上下文中调用wait()、notify()或notifyAll()方法。
  2. 在Java中wait和notify方法之间的任何潜在竞争条件。
因此,我想让重写wait()并不是一个好主意。
更多信息请参见Doug Lea的"Concurrent Programming in Java (Second Edition)"第3.2.3节。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接