2012-02-24 105 views
3

如果多個線程同時重複一個HashMap對象,沒有修改它,是否有機會的競爭條件?同時迭代HashMap對象是否線程安全?

+1

很明顯,如果沒有人正在修改任何東西,不能有任何數據競賽 – Voo 2012-02-24 02:10:51

+3

@Voo:我不會說「顯然」。這是事實,因爲JDK在這方面設計得很好,但設計一個API似乎是可能的,其中看似只讀操作涉及內部臨時修改,但無法安全地同時完成。 (事實上​​,我出於各種原因自己創建了這樣的API。)所以這是一個合理的問題。 – ruakh 2012-02-24 02:13:33

+0

線程是否使用相同的迭代器? – 2012-02-24 02:15:08

回答

4

沒有競爭,如果你可以保證沒有其他線程在迭代時修改這個HashMap。

3

不,這是完美的。只要所有讀取與所有寫入同步,並且所有寫入都彼此同步,則併發讀取不會造成任何損害;所以如果根本沒有寫入,那麼所有併發訪問都是安全的。

+1

如果未修改,則不需要同步。 – 2012-02-24 08:31:01

+1

@PeterLawrey:確實如此。 – ruakh 2012-02-24 12:35:04

0

如果您要重複迭代一個Map,您可能會發現迭代數組副本的速度稍微快一些。

private final HashMap<String, String> properties = new HashMap<String, String>(); 
private volatile Map.Entry<String, String>[] propertyEntries = null; 

private void updatePropertyEntries() { 
    propertyEntries = properties.entrySet().toArray(new Map.Entry[properties.size()]); 
} 

{ 
    // no objects created 
    for (Map.Entry<String, String> entry : propertyEntries) { 

    } 
} 

順便說一句:你可以有一個線程修改/替換propertyEntries,同時用這種模式在許多線程中迭代。

1

這將是對的。但是,如果任何線程添加或刪除一個項目,這將拋出異常在任何其他線程只是迭代HashMap(實際上任何收集)