wait释放保持在调用wait的对象上的监视器,但不释放任何其他监视器.
The current thread must own this object’s monitor. The thread releases ownership of this monitor and waits […].
换句话说,给出以下内容:
synchronized (a) {
synchronized (b) {
b.wait();
}
}
在b.wait(),当前线程释放b的监视器,但不释放监视器.
如果t.join()是在内部使用t.wait()实现的,则t的监视器在等待时释放,但不会释放任何其他监视器.
顺便说一下,这种连接实现是leaky abstraction的情况.如果Thread使用私有的最终Object监视器;相反,我们可以说join没有发布监视器,即使它在内部使用等待而我们不知道.没有理由记录使用wait的实现细节,因为监视器对我们来说是不可访问的,所以我们不需要知道它.
我们知道join在内部使用wait的原因是最初编写方法的人选择了一个我们可以访问的监视器.这就需要揭示实现细节. join不是真的应该从我们的角度发布监视器,只是等待一个线程完成,但是选择了一个实现,这需要我们比我们应该知道更多.