我对Java中的synchronized
-块有些困惑。
如果一个线程进入类的实例的synchronized
块,其他线程可以使用同一类的同一实例的synchronized
方法吗?
void myMain() {
synchronized(this) {
while(suspendFlag)
wait();
}
}
}
synchronized void mysuspend() {
suspendFlag = true;
}
答案 0 :(得分:1)
synchronized void mysuspend(){
suspendFlag = true;
}
等效于
void mysuspend(){
synchronized(this) {
suspendFlag = true;
}
}
因此,在您的代码中,不可能有一个线程进入类实例的synchronized
块,而其他线程则使用同步方法mysuspend()
答案 1 :(得分:0)
是的,因为它们是可独立调用的。 线程未附加到类或其实例。一个类的每个方法都可以独立于不同的线程调用。
可以限制这种独立性的是synchronized
方法。它们是synchronized(this) {...}
作为方法主体的快捷方式。
无论何时输入synchronized
块,都会保留关联实例上的监视器。
wait()
再次释放了周围synchronized
块上的监视器,因此可以执行其他同步块。
您的代码有问题:wait()
将等待直到监视器上的notify()
被调用。但是在您的代码中既不会调用notify()
,也不会wait()
超时。
您的while(suspendFlag) wait();
将永远等待...