为什么Object.wait()是final?

时间:2013-12-26 20:47:11

标签: java

在Java中,Object的wait()方法作为最终方法实现的原因是什么?是否需要覆盖wait()?

2 个答案:

答案 0 :(得分:4)

Java语言规范描述了同步的工作原理。在众多概念中,如对象监视器,还有Wait Sets的概念。

  

除了拥有相关的监视器之外,每个对象都有一个   相关的等待集。等待集是一组线程。

     

首次创建对象时,其等待集为空。初级   向等待集添加线程和从中移除线程的操作是   原子。 仅通过方法操纵等待集   Object.waitObject.notifyObject.notifyAll

如果您能够覆盖该方法,您可能会发现自己有办法打破同步。 Java不能允许这样做。它必须能够控制确切的实现,这就是final的原因。

答案 1 :(得分:1)

我们用Java中的synchronized方法或synchronized块调用Java中的wait(),notify()或notifyAll方法,以避免:

  1. Java中的IllegalMonitorStateException,如果不这样做,将会发生 从synchronized调用wait(),notify()或notifyAll()方法 上下文。
  2. 等待和通知方法之间的任何潜在竞争条件 在爪哇。
  3. 因此,我想让覆盖wait()

    不是一个好主意

    请参阅Doug Lea的“Java并行编程(第二版)”第3.2.3节中的更多内容。