首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同一实例的同步块和同步方法

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

Stack Overflow用户
提问于 2019-05-14 16:22:12
回答 2查看 73关注 0票数 1

我对Java中的synchronized-blocks有点困惑。

如果一个线程进入一个类实例的synchronized-block,其他线程可以使用同一个类的同一实例的synchronized-methods吗?

代码语言:javascript
复制
void myMain() {
    synchronized(this) {
        while(suspendFlag)
             wait();
        }
    }
}

synchronized void mysuspend() {
    suspendFlag = true;
}
EN

回答 2

Stack Overflow用户

发布于 2019-05-14 16:30:24

代码语言:javascript
复制
synchronized void mysuspend(){
    suspendFlag = true;
}

等同于

代码语言:javascript
复制
void mysuspend(){
    synchronized(this) {
        suspendFlag = true;
    }
}

因此,在您代码中,不可能一个线程进入类实例的synchronized块,而其他线程使用同步方法mysuspend()

票数 1
EN

Stack Overflow用户

发布于 2019-05-14 16:27:23

是的,因为它们是独立可调用的。线程没有附加到类或它的实例。类的每个方法可以独立于不同的线程调用。

可以限制这种独立性的是synchronized方法。它们是synchronized(this) {...}作为方法体的快捷方式。

每当进入synchronized块时,关联实例上的监视器都会被挂起。

wait()再次释放周围synchronized块上的监视器,以便可以执行其他同步的块。

您的代码有一个问题:wait()将等待,直到调用监视器上的notify()。但是在您的代码中,既没有调用notify(),也没有调用wait()超时。

你的while(suspendFlag) wait();将永远等待...

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56125961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档