同一实例的同步块和同步方法

时间:2019-05-14 08:22:12

标签: java multithreading

我对Java中的synchronized-块有些困惑。

如果一个线程进入类的实例的synchronized块,其他线程可以使用同一类的同一实例的synchronized方法吗?

void myMain() {
    synchronized(this) {
        while(suspendFlag)
             wait();
        }
    }
}

synchronized void mysuspend() {
    suspendFlag = true;
}

2 个答案:

答案 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();将永远等待...