我最近在Java中编写一个并发程序时遇到了以下困境:假设您有一个全局数据结构,它是常规非同步、非并发库(例如HashMap)的一部分。是否可以允许多个线程迭代该集合(只读取,不修改),可能在不同的交替时间内进行,即当线程1在迭代时,线程2可能正在同一地图上获取其迭代器?
我最近在Java中编写一个并发程序时遇到了以下困境:假设您有一个全局数据结构,它是常规非同步、非并发库(例如HashMap)的一部分。是否可以允许多个线程迭代该集合(只读取,不修改),可能在不同的交替时间内进行,即当线程1在迭代时,线程2可能正在同一地图上获取其迭代器?
没问题。能够做到这一点是创建迭代器接口的原因。每个线程在遍历集合时都有自己的迭代器实例,该实例保持其状态(例如,您正在迭代过程中的位置)。
这允许多个线程同时遍历同一集合。
只有在尝试对数据结构进行并发修改时才会出现问题。
例如,如果一个线程正在迭代Map的内容,而另一个线程删除该集合中的元素,则您将遇到严重的问题。
如果确实需要一些线程安全地修改该集合,Java提供了机制来实现这一点,即ConcurrentHashMap。
还有Hashtable,它与HashMap具有相同的接口,但是它是同步的,尽管它的使用目前不建议(已弃用),因为当元素数量变得更大时,其性能会受到影响(与ConcurrentHashMap相比,后者不需要锁定整个集合)。
如果您恰好拥有一个未同步的集合,并且需要多个线程在其上读取和写入,则可以使用Collections.synchronizedMap(Map)获取其同步版本。