對於這個簡單的同步聲明:同步語句 - 同步方法和同步語句是否相同?
public void addName(String name) {
synchronized(this) { // line1
lastName = name;
nameCount++;
}
nameList.add(name);
}
看來這兩個線程可以說t1
和t2
可以調用在同一時間的addName
方法,但一旦得到行評價爲line1
,只有一個線程可以繼續,這意味着其他線程將不得不暫停。這意味着即使將nameList
放在synchronized語句之外,也可以保證nameList
不會被多個線程衝突。
這是真的嗎?如果是的話,那麼有沒有下面的方法之間的區別,如果沒有已進入同步語句之前完成:
public void addName(String name) {
synchronized(this) { //line1
lastName = name;
nameCount++;
nameList.add(name);
}
}
或者:
public synchronized void addName(String name) {
lastName = name;
nameCount++;
nameList.add(name);
}
我知道正是
void synchronized add(){
}
與上述相同:
void add(){
synchronized(this){
}
}
什麼讓我感到困惑的是,在addName
例子,我想執行順序可能是這樣的:
t1:synchronized steatement
t1:nameList.add
t2:synchronized steatement
t2:nameList.add
這意味着沒有爲synchronized statement
和nameList.add
之間的其他線程執行沒有變化。所以將nameList.add
放在我們的同步塊外部沒有區別。
但實際上,執行可能看起來像這樣由@JB Nizet答案:
t1:synchronized steatement
t2:synchronized steatement
t2:nameList.add
t1:nameList.add
然後把nameList
外部或塊內是很重要的。
它們是等價的(後兩個)。 – Maroun
哦,是的,我忘了:) – hguser
https://stackoverflow.com/questions/574240/is-there-an-advantage-to-use-a-synchronized-method-instead-of-a-synchronized-blo ?rq = 1有很多關於同步方法和塊之間差異的鏈接或相關問題。 –