[英]notify() in synchronized block
我在项目中找到了打击代码。 但是我不明白为什么唯一的notify()方法是在sync block中。
synchronized(this){
notify();
}
这段代码是否合乎逻辑,如果是的话,真正的目的是什么?
您应该仅从拥有对象监视器的线程中调用notify
。 从文档中 :
此方法只能由作为该对象的监视器的所有者的线程调用。 线程通过以下三种方式之一成为对象监视器的所有者:
- 通过执行该对象的同步实例方法。
- 通过执行在对象上同步的同步语句的主体。
- 对于类类型的对象,通过执行该类的同步静态方法。
(我的重点)
要理解它为什么有意义,请考虑必须在同一对象上同步其他块,这些块将被该块唤醒。
看看这个:
http://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html
notify()唤醒在同一对象上调用wait()的第一个线程。
class ThreadB extends Thread{
int total;
@Override
public void run(){
synchronized(this){
for(int i=0; i<100 ; i++){
total += i;
}
notify();
}
}
像上面的例子一样,我们使用notify向其他正在等待的线程发送信息消息(嘿,我完成我的工作,醒了!)。 所以在您的问题上,这没有意义
这不一定是错误的,但绝对是一个不好的信号。 在该代码的其他地方,将无条件wait
。 例如:
synchronized(this) {
wait();
}
现在可能可以正常工作。 但是,如果在wait
之前执行了notify
则将导致死锁。
通常,您要在某种情况下等待:
synchronized(this) {
while(!this.flag) {
this.wait();
}
}
并使用这样的notify
:
synchronized(this) {
this.flag = true;
this.notify();
}
这将永远不会陷入僵局,而且很明显我们在等待什么。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.