繁体   English   中英

关于从同步块调用方法

[英]About calling methods from a synchronized block

正在同步一个等价的方法,只让一个线程对它进行评估,直到它超出范围,包括内部方法调用?

例如:

public synchronized void foo(){

    if(critical condition){
        bar();  // can influence the above condition
    }
    baz(); // can influence the above condition
}

可以将两个线程放在bar (假设它只能从这里调用)?

如果baz可以从除foo之外的代码中的另一个地方调用,那么可以使用两个线程吗?

可以将两个线程放在bar中(假设它只能从这里调用)?

是的,只要他们使用不同的对象,或者一个是wait() ing。

如果baz可以从除foo之外的代码中的另一个地方调用,那么可以使用两个线程吗?

是的,在一个方法上放置synchronized会对未同步的方法没有影响。

这是编写代码的等效方法:

public void foo(){
    synchronized (this) {
        if(critical condition){
            bar();  // can influence the above condition
        }
        baz(); // can influence the above condition
    }
}

因为synchronized方法实际上使用this作为锁定对象来同步它们的实体。

那么,两个线程可以同时执行foo()还是同时执行bar() 当然,如果他们正在执行不同对象的foo()bar()

此外,对baz()的调用根本不同步,因此即使任何两个线程也可以同时运行单个对象的baz() ,只要其中至少有一个从foo()外部调用它。

这两个资源有助于理解Java中的同步和不执行的操作:

我建议您检查这些页面,因为有些信息在您检查之前不太明显。 例如:

  • 两个不同的线程不能同时执行单个对象的两个不同的同步方法。
  • 单个线程可以执行同一对象的两个不同的同步方法(称为“ 重入同步”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM