CopyOnWriteArrayList
对给定集合的add、set、remove操作会导致创建内部数组的新副本。这确保我们不会捕获ConcurrentModificationException。
请记住,在复制数组时,只会复制对对象的引用,包括对非线程安全元素字段的访问。此类集合最适用于写入操作最少的情况。

CopyOnWriteArrayList<E>是ArrayList 的线程安全模拟,基于 CopyOnWrite 算法实现。其他方法和构造函数如下所述:
CopyOnWriteArrayList(E[] toCopyIn) | 将数组作为输入的构造函数。 |
int indexOf(E e, int index) | 返回找到的第一个元素的索引,从给定索引开始。 |
int lastIndexOf(E e, int index) | 返回在反向搜索中找到的第一个元素的索引,从给定索引开始。 |
布尔 addIfAbsent(E e) | 如果元素不在集合中,则添加一个元素。equals方法用于比较元素。 |
int addAllAbsent(Collection<? extends E> c) | 如果元素不在集合中,则添加元素。返回添加的元素数。 |
ConcurrentMap 接口
改进了HashMap和TreeMap的实现,支持多线程和可扩展性。

ConcurrentMap<K, V>是一个通过附加原子操作扩展Map 的接口。
V putIfAbsent(K 键, V 值) | 仅当键不在集合中时才添加新的键值对。返回给定键的先前值。 |
布尔删除(对象键,对象值) | 仅当给定键与 Map 中的给定值匹配时才删除键值对。如果元素已成功删除,则返回 true。 |
布尔替换(K 键,V 旧值,V 新值) | 仅当旧值与 Map 中的给定值匹配时,才通过键将旧值替换为新值。如果该值已被新值替换,则返回 true。 |
V 替换(K 键,V 值) | 仅当键与任何值相关联时,才通过键将旧值替换为新值。返回给定键的先前值。 |
ConcurrentHashMap<K, V> - 此处数据以分段的形式呈现,分段分为键哈希。结果,如果您需要访问,则段被锁定,而不是对象。迭代器不会抛出ConcurrentModificationException并表示特定时间段内的数据。
ConcurrentHashMap 的实现
ConcurrentHashMap<K, V> - 此处数据以段的形式呈现,按键哈希分解。结果,数据访问被段锁定,而不是被一个对象锁定。此外,迭代器表示特定时间片的数据并且不会抛出ConcurrentModificationException。
ConcurrentNavigableMap<K,V> - 扩展NavigableMap接口并返回一个 ConcurrentNavigableMap。所有迭代器都可以安全使用,不会抛出ConcurrentModificationException。
ConcurrentSkipListMap<K, V>是用于多线程的TreeMap 的模拟。数据按键排序,并保证containsKey、get、put、remove和其他类似操作的平均 log(N) 性能。
ConcurrentSkipListSet<E>是基于ConcurrentSkipListMap的Set接口的实现。
GO TO FULL VERSION