在Java中:是List.iterator()
線程安全的,即返回的迭代器在任何時候反映列表的當前狀態,還是僅在創建列表時的狀態?List.iterator()是線程安全的嗎?
18
A
回答
30
List.iterator()的行爲未定義或與不同的List實現一致。
對於ArrayList,LinkedList,如果在迭代列表時修改列表,則可能會收到ConcurrentModificationException。 (這是不能保證的)避免這個問題的方法是使用synchronizedList()並在迭代時鎖定列表。
對於Vector,集合是同步的,但迭代器不是線程安全的。
對於CopyOnWriteArrayList,您可以在調用iterator()時獲得列表中元素的快照,此迭代器是線程安全的,並且不需要使用任何鎖定。注意:元素的內容可以改變。
7
沒有迭代器是線程安全的。如果底層集合在迭代中發生更改,則會引發ConcurrentModificationException
。
即使同步集合的迭代器不是線程安全的 - 您必須手動進行同步。
一個例外是CopyOnWriteArrayList
,它在迭代過程中保存了一個快照。
相關問題
- 1. 是DatagramSocket.send線程安全嗎?
- 2. 是TcpClient.Available線程安全嗎?
- 3. 線程安全(是嗎?)
- 4. 是unique_ptr線程安全嗎?
- 5. 是System.DirectoryServices.AccountManagement.GroupPrincipal線程安全嗎?
- 6. 是sqlite.swift線程安全嗎?
- 7. 是DocumentBuilder.parse()線程安全嗎?
- 8. 是Microsoft.Practices.EnterpriseLibrary.Data.Database.SetParameterValue線程安全嗎?
- 9. 是長線程安全嗎?
- 10. 是javax.sql.DataSource線程安全嗎?
- 11. 是java.util.UUID線程安全嗎?
- 12. Silverlight的CollectionViewSource是線程安全的嗎?
- 13. EJB 3.0,是線程安全的嗎?
- 14. LWP :: UserAgent不是線程安全的嗎?
- 15. python zipfile是線程安全的嗎?
- 16. 是JavaMailSenderImpl的spring線程安全嗎?
- 17. CString :: LoadString()是線程安全的嗎?
- 18. 是C#中的CreateDirectory()線程安全嗎?
- 19. Stream.Write是線程安全的嗎?
- 20. Rails 3 cattr_accessor是線程安全的嗎?
- 21. ClassLoader應該是線程安全的嗎?
- 22. 是ICU的ucnv_convertEx線程安全嗎?
- 23. Hessian類SerializerFactory是線程安全的嗎?
- 24. std :: condition_variable是線程安全的嗎?
- 25. java.util.Observable是線程安全的嗎?
- 26. 寫這個是線程安全的嗎?
- 27. EventAggregator,它是線程安全的嗎?
- 28. C socket API是線程安全的嗎?
- 29. Erlang JInterface - 是OtpMBox線程安全的嗎?
- 30. Java Transport.send()是線程安全的嗎?
「沒有迭代器是線程安全的,除了一個」可能被寫爲「除了兩個或三個以外,所有都是線程安全的」;) – 2011-05-01 11:07:59
如果底層集合在迭代過程中被另一個線程更改,則CME可能被拋出或可能不被拋出拋出,因爲內部修改計數器不是原子的。 – Anton 2017-01-05 00:10:48