如果多個線程同時重複一個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. 在迭代過程中更改HashMap鍵/值是否安全?
- 2. 線程安全對象 - 是否靜態?
- 3. GridFS Java對象是否線程安全?
- 4. 迭代同步包裝是否安全?
- 5. 這是多線程迭代安全嗎?
- 6. 併發HashMap迭代器:線程的安全性如何?
- 7. 對於不同的密鑰,HashMap是線程安全的嗎?
- 8. 存儲在線程安全集合線程中的對象是否安全?
- 9. Collections.synchronized映射是否使迭代器線程安全
- 10. 對象成員對於Callable&ExecutorService是否是線程安全的
- 11. 最終的HashMap是線程安全的
- 12. 迭代在同步塊中檢索的列表是否線程安全?
- 13. 以下代碼是否線程安全
- 14. 這段代碼是否線程安全?
- 15. 該代碼是否線程安全?
- 16. EF對象是線程安全的嗎?
- 17. 什麼是線程安全的對象
- 18. python迭代器和線程安全
- 19. 成員集合迭代線程安全
- 20. 安全迭代由多個線程
- 21. 一個對象是否可以說是線程安全的?
- 22. 是否Box.add()線程安全?
- 23. 是否mysql_insert_id線程安全?
- 24. NashornScriptEngine是否線程安全?
- 25. RegExp.MatchString是否線程安全?
- 26. SeekableStream是否線程安全?
- 27. 是否log4j線程安全?
- 28. NSPasteboard是否線程安全?
- 29. LIBSVM是否安全線程
- 30. epoll是否線程安全?
很明顯,如果沒有人正在修改任何東西,不能有任何數據競賽 – Voo 2012-02-24 02:10:51
@Voo:我不會說「顯然」。這是事實,因爲JDK在這方面設計得很好,但設計一個API似乎是可能的,其中看似只讀操作涉及內部臨時修改,但無法安全地同時完成。 (事實上,我出於各種原因自己創建了這樣的API。)所以這是一個合理的問題。 – ruakh 2012-02-24 02:13:33
線程是否使用相同的迭代器? – 2012-02-24 02:15:08