vri*_*ucz 10 java multithreading
据我了解,内部obj.join()
调用wait()
.这意味着join()
始终释放锁(因为wait()
在调用后总是释放锁).
API文档解释说:
此实现使用一系列
this.wait
调用条件this.isAlive
.当一个线程终止时,该this.notifyAll
方法被调用.建议应用程序无法使用wait
,notify
或notifyAll
在Thread
实例.
人们在这里SO说,join()
不会释放任何锁定,因为API没有提到它明确.但这种逻辑对我来说似乎很奇怪.
这是join()
代码中的主要逻辑:
while (isAlive()) {
wait(0);
}
Run Code Online (Sandbox Code Playgroud)
这个网站进一步增加了混乱(我认为他们错了):
3)
wait()
和join()
方法之间的第三个区别是,当一个线程调用该wait()
方法时,它释放为wait()
被调用的对象保留的任何锁,但是调用该join()
方法不会释放任何监视器或锁.
wait
释放保持在wait
被调用对象上的监视器,但不释放任何其他监视器.
当前线程必须拥有此对象的监视器.该线程释放该监视器的所有权并等待[...].
换句话说,给出以下内容:
synchronized (a) {
synchronized (b) {
b.wait();
}
}
Run Code Online (Sandbox Code Playgroud)
在b.wait()
,当前线程释放b
的监视器,但不是a
监视器.
如果t.join()
是在t.wait()
内部使用,则t
在等待时释放监视器,但不释放任何其他监视器.
顺便提一下,这个join
实现是一个漏洞抽象的例子.如果Thread
使用a private final Object monitor;
来代替,我们可以说join
没有发布监视器,即使它在wait
内部使用而我们不知道.没有理由记录使用的实现细节wait
,因为我们无法访问监视器,因此我们不需要了解它.
我们知道内部join
使用的原因wait
是最初编写方法的人选择了我们可以访问的监视器.这就需要揭示实现细节.join
实际上不应该从我们的角度发布监视器,只是等待一个线程完成,但是选择了一个实现,这需要我们比我们应该知道更多.
归档时间: |
|
查看次数: |
561 次 |
最近记录: |