我從https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html特定碼同步聲明片斷
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}
- 下面的代碼片段,我認爲
nameList.add(name);
還需要在synchronized塊,因爲名稱列表的內容也應該是這樣的集合發生,之前的關係。 synchronizedList(列表)。
對此有何看法?
- 而且它也說
在不同步的語句,就必須是用於調用nameList.add的唯一目的一個單獨的,非同步的 方法。
我不明白爲什麼nameList.add應該在單獨的非同步方法中,如果沒有同步語句。
是的,這有點奇怪。沒有更多細節(在文檔部分),很難知道。我認爲他們所得到的是在鎖定時應該小心調用第三方代碼,但這不是一個好例子。但是你可以想象一個'List'實現,例如,寫入一個RDBMS並等待響應 - 一個潛在的長操作,在此期間你持有該鎖。在最壞的情況下,如果List獲得一個鎖,然後調用一個在你的對象上同步的回調函數,你甚至可能會死鎖。 – yshavit