如果多個線程同時重複一個HashMap
對象,沒有修改它,是否有機會的競爭條件?同時迭代HashMap對象是否線程安全?
3
A
回答
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(實際上任何收集)
相關問題
- 1. 線程安全對象 - 是否靜態?
- 2. 併發HashMap迭代器:線程的安全性如何?
- 3. 對於不同的密鑰,HashMap是線程安全的嗎?
- 4. 存儲在線程安全集合線程中的對象是否安全?
- 5. Collections.synchronized映射是否使迭代器線程安全
- 6. 對象成員對於Callable&ExecutorService是否是線程安全的
- 7. 最終的HashMap是線程安全的
- 8. 這段代碼是否線程安全?
- 9. python迭代器和線程安全
- 10. 成員集合迭代線程安全
- 11. 安全迭代由多個線程
- 12. 什麼是線程安全的對象
- 13. 是否mysql_insert_id線程安全?
- 14. 是否log4j線程安全?
- 15. NSPasteboard是否線程安全?
- 16. RegExp.MatchString是否線程安全?
- 17. SeekableStream是否線程安全?
- 18. 線程是否表示線程安全?
- 19. 多線程讀取靜態對象是否安全?
- 20. SyncRoot對象是否真的線程安全?
- 21. Python套接字對象是否線程安全?
- 22. 在後臺線程上實例化UI對象是否安全?
- 23. Scala-如何確定對象是否線程安全?
- 24. 此代碼是否線程安全?我怎樣才能使它線程安全?
- 25. 部分線程安全是否使Java類線程安全?
- 26. 線程同步是否意味着線程安全?
- 27. 是否可以同時從多個線程調用write()安全?
- 28. Java HashMap只讀線程安全
- 29. 是隻讀的EnumSet迭代器線程安全嗎?
- 30. 迭代併發集合時的線程安全
很明顯,如果沒有人正在修改任何東西,不能有任何數據競賽 – Voo 2012-02-24 02:10:51
@Voo:我不會說「顯然」。這是事實,因爲JDK在這方面設計得很好,但設計一個API似乎是可能的,其中看似只讀操作涉及內部臨時修改,但無法安全地同時完成。 (事實上,我出於各種原因自己創建了這樣的API。)所以這是一個合理的問題。 – ruakh 2012-02-24 02:13:33
線程是否使用相同的迭代器? – 2012-02-24 02:15:08