集合類提供了各種獲取線程安全集合的方法。那麼爲什麼有必要在迭代時手動同步訪問?手動需要同步訪問同步列表/地圖/設置等
回答
每種方法都是線程安全的。如果對同步集合進行多次調用,除非明確地持有鎖,否則這不是線程安全的。使用迭代器需要隱式地對迭代器進行多次調用,所以沒有辦法解決這個問題。
某些併發庫集合所做的是提供弱一致性。它們提供了一個實用的解決方案,即在迭代時添加或刪除的元素可能或不可見。
以不安全的方式使用線程安全集合的一個簡單示例。
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. F#同步訪問列表
- 2. 來自地圖的同步設置或來自同步地圖的設置?
- 3. 同步訪問
- 4. 訪問電子郵件同步設置
- 5. 同步同步列表
- 6. 本地創建的Java對象是否需要同步訪問?
- 7. 手動同步iCloud
- 8. 如何同步緩存列表訪問
- 9. GAE中的列表訪問同步
- 10. 同步訪問ArrayList
- 11. eclipse工作區同步設置 - 要同步的內容?
- 12. $廣播異步工作,需要同步
- 13. 異步代碼中需要的同步
- 14. Netbeans設置同步
- 15. Hazelcast地圖同步
- 16. Java地圖同步
- 17. 列表框,滾動同步
- 18. 是否等待()需要同步本地變量
- 19. 需要同步幫助
- 20. Java:需要同步ExecutorService?
- 21. 我需要同步嗎?
- 22. 我需要同步ExecutorService.execute()嗎?
- 23. 需要同步編程
- 24. 在這裏同步需要
- 25. 我需要同步這個
- 26. 這裏需要同步嗎?
- 27. 這是否需要同步?
- 28. onSensorChanged(...)需要同步嗎?
- 29. Monitor.Wait是否需要同步?
- 30. 爲什麼要同步一個同步列表?
你爲什麼這麼想?你對此感到困惑嗎? – 2012-02-27 17:59:07
因爲這就是作者的寫作方式。 – Woot4Moo 2012-02-27 17:59:26