关于从同步块调用方法

时间:2016-10-16 15:31:03

标签: java multithreading java-8 synchronization thread-safety

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

例如:

public synchronized void foo(){

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

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

如果可以从baz以外的代码中的其他位置调用foo,那么可以在其中包含两个线程吗?

2 个答案:

答案 0 :(得分:3)

  

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

是的,前提是他们使用的是不同的对象,或者是wait()

  

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

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

答案 1 :(得分:2)

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

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

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

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

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

这两个资源对于理解同步在Java中做什么和不做什么很有用:

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

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