集合類提供了各種獲取線程安全集合的方法。那麼爲什麼有必要在迭代時手動同步訪問?手動需要同步訪問同步列表/地圖/設置等
回答
每種方法都是線程安全的。如果對同步集合進行多次調用,除非明確地持有鎖,否則這不是線程安全的。使用迭代器需要隱式地對迭代器進行多次調用,所以沒有辦法解決這個問題。
某些併發庫集合所做的是提供弱一致性。它們提供了一個實用的解決方案,即在迭代時添加或刪除的元素可能或不可見。
以不安全的方式使用線程安全集合的一個簡單示例。
private final List<String> list = Collections.synchronizedList(
new ArrayList<String>());
list.add("hello");
String hi = list.remove(list.size()-1);
添加和刪除都是線程安全的,您將不會單獨使用它們。問題是另一個線程可能會改變集合BETWEEN調用(不在調用中),從而導致此代碼以多種方式中斷。
「如果您對同步集合進行多個調用,這不是線程安全的」,那麼爲什麼java會說它是同步的? – Rekha 2012-02-27 18:10:04
每個單獨的操作都是同步的,但是多個操作順序不會作爲一個組進行同步,除非明確這樣做。 – 2012-02-27 18:49:03
該類及其所有方法都是線程安全的,但這並不禁止您以不安全的方式組合使用它們。 – 2012-02-27 19:42:56
- 1. 訪問電子郵件同步設置
- 2. 同步同步列表
- 3. GAE中的列表訪問同步
- 4. 同步訪問ArrayList
- 5. 列表框,滾動同步
- 6. 這裏需要同步嗎?
- 7. onSensorChanged(...)需要同步嗎?
- 8. Monitor.Wait是否需要同步?
- 9. 在這裏同步需要
- 10. 這是否需要同步?
- 11. 需要同步編程
- 12. 爲什麼要同步一個同步列表?
- 13. 同步需要動態路徑
- 14. 自動同步需要更新它
- 15. 編程通用同步設置「自動同步」複選框
- 16. 手動同步SQL Server enigma
- 17. Java CDI @ApplicationScoped同步/異步訪問
- 18. synchronizedCollection幷包含 - 我需要手動同步嗎?
- 19. 同步2列表
- 20. 散列表同步
- 21. Java同步列表
- 22. Vulkan:vkWaitForFences同步訪問VkDevice
- 23. 同步訪問UITableViewDelegate邏輯
- 24. 同步訪問返回值
- 25. 如何同步訪問indexedDB?
- 26. 訪談問:Java同步
- 27. 同步對SimpleDateFormat的訪問
- 28. 同步文件訪問
- 29. 同步數據訪問
- 30. 是否需要volatile,以防止同步訪問
你爲什麼這麼想?你對此感到困惑嗎? – 2012-02-27 17:59:07
因爲這就是作者的寫作方式。 – Woot4Moo 2012-02-27 17:59:26