2010-01-18 20 views
3

我看靜態方法可用性的同步......方法java.util.Collections中

Collections.synchronizedList(List<T> list) 

的Javadoc說

當務之急是用戶在返回手動同步列表時迭代它...

如果我仍然必須手動同步它,創建一個同步列表的目的是什麼?

+1

更一般地說,您必須在任何時候手動同步以進行*多個*方法調用,而不需要在兩者之間進行狀態更改。例如,獲取列表的最後一個元素:'synchronized(list){return list.get(list.size() - 1);}'。 –

回答

7

爲什麼要使用

Collections.synchronizedList(List<T> list) 

是因爲所有的方法,但迭代器使用的是列表本身的互斥體,這樣你就不必做

synchronized(list) { 
    list.add(type); 
} 

而是同步的原因你可以做

list.add(type); 

它將是線程安全的。

迭代列表時,唯一不同步的方法是。列表迭代器不能以同步方式返回,因爲之後會迭代它,這就是爲什麼需要手動同步列表。因此,總而言之,您只需在迭代列表時同步列表,其他所有內容都不需要。

1

java collections tutorial解釋了這一點。基本上,每次迭代都會調用對基礎集合的多個調用。這些調用被簡化爲一個單獨的「事務」。