2016-07-15 37 views
0

代碼片斷如下圖所示:爲什麼同步對象仍然可以操縱

List<String> list = new ArrayList<>(); 

public void addValue(int i) { 
    synchronized (list) { 
     list.add("list" + i); 
    } 
} 

我的問題是,什麼是關鍵詞​​鎖定。
當兩個線程要求執行代碼塊時,將會檢查list的哪些內容?
同樣的問題是我同步this但它的字段仍然可以改變。

回答

0

同步塊被鎖定。當代碼運行時,線程不會鎖定對象,而是它的對象list的鎖(它是對象頭中的標記字),因此其他線程無法獲得相同的鎖。因此,塊內的代碼只能同時由一個線程執行。