【问题标题】:When to call wait() on super [closed]何时在 super [关闭] 上调用 wait()
【发布时间】:2014-05-08 12:43:06
【问题描述】:

何时调用super.wait(),如下所示 -

synchronized (this)
      {
        while (true)
        {
          try
          {
            super.wait();
          }
          catch (InterruptedException e)
          {
            return;
          }

        }
 }

【问题讨论】:

  • 在我们回答之前,您至少需要说一下,您要实现什么目标?
  • 嗯,这是一个奇怪的结构,很可能是一个错误。但它仍然有效。为什么所有的反对票?
  • 好吧,我在@bdonlan 在这篇帖子link 中的一个答案中看到了这一点。这是我第一次看到在 super 上调用 wait。所以出于好奇问了这个问题。

标签: java multithreading wait


【解决方案1】:

Object.wait() 被声明为 final 并且不能被覆盖。 所以super.wait() 总是意味着只是wait() 但有点长。

【讨论】:

  • 原始发帖人的代码中没有尝试覆盖。
  • 我是说在这种情况下 wait 和 super.wait 是等价的,因为 wait() 总是在一个超类中。
  • 你说的“...但是有点长”是什么意思?
【解决方案2】:

wait() 必须在与它synchronized 相同的对象上调用,否则将导致java.lang.IllegalMonitorStateException

应该是this.wait()

【讨论】:

  • "this" 和 "super" 总是指同一个对象。 this.foo() 和 super.foo() 之间的区别仅在对象的类和该类的祖先之一的类中定义了 foo() 方法时才重要。然后“super”允许调用祖先版本的函数。正常的用例是将 this.foo() 定义为继承函数的包装器。
猜你喜欢
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多