同步一个等价的方法,只让一个线程对它进行评估,直到它超出范围,包括内部方法调用?
例如:
public synchronized void foo(){
if(critical condition){
bar(); // can influence the above condition
}
baz(); // can influence the above condition
}
可以将两个主题放在bar
中(假设它只能从这里调用)?
如果可以从baz
以外的代码中的其他位置调用foo
,那么可以在其中包含两个线程吗?
答案 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中做什么和不做什么很有用:
我建议您检查这些页面,因为有些信息在您检查之前不太明显。例如: