2012-02-27 110 views

回答

3

每種方法都是線程安全的。如果對同步集合進行多次調用,除非明確地持有鎖,否則這不是線程安全的。使用迭代器需要隱式地對迭代器進行多次調用,所以沒有辦法解決這個問題。

某些併發庫集合所做的是提供弱一致性。它們提供了一個實用的解決方案,即在迭代時添加或刪除的元素可能或不可見。


以不安全的方式使用線程安全集合的一個簡單示例。

private final List<String> list = Collections.synchronizedList(
               new ArrayList<String>()); 

list.add("hello"); 
String hi = list.remove(list.size()-1); 

添加和刪除都是線程安全的,您將不會單獨使用它們。問題是另一個線程可能會改變集合BETWEEN調用(不在調用中),從而導致此代碼以多種方式中斷。

+0

「如果您對同步集合進行多個調用,這不是線程安全的」,那麼爲什麼java會說它是同步的? – Rekha 2012-02-27 18:10:04

+1

每個單獨的操作都是同步的,但是多個操作順序不會作爲一個組進行同步,除非明確這樣做。 – 2012-02-27 18:49:03

+0

該類及其所有方法都是線程安全的,但這並不禁止您以不安全的方式組合使用它們。 – 2012-02-27 19:42:56