我对Java中的synchronized-blocks有点困惑。
如果一个线程进入一个类实例的synchronized-block,其他线程可以使用同一个类的同一实例的synchronized-methods吗?
void myMain() {
synchronized(this) {
while(suspendFlag)
wait();
}
}
}
synchronized void mysuspend() {
suspendFlag = true;
}发布于 2019-05-14 16:30:24
synchronized void mysuspend(){
suspendFlag = true;
}等同于
void mysuspend(){
synchronized(this) {
suspendFlag = true;
}
}因此,在您代码中,不可能一个线程进入类实例的synchronized块,而其他线程使用同步方法mysuspend()
发布于 2019-05-14 16:27:23
是的,因为它们是独立可调用的。线程没有附加到类或它的实例。类的每个方法可以独立于不同的线程调用。
可以限制这种独立性的是synchronized方法。它们是synchronized(this) {...}作为方法体的快捷方式。
每当进入synchronized块时,关联实例上的监视器都会被挂起。
wait()再次释放周围synchronized块上的监视器,以便可以执行其他同步的块。
您的代码有一个问题:wait()将等待,直到调用监视器上的notify()。但是在您的代码中,既没有调用notify(),也没有调用wait()超时。
你的while(suspendFlag) wait();将永远等待...
https://stackoverflow.com/questions/56125961
复制相似问题