[英]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.