Java集合框架

2023-08-06 1409阅读

如果想深入的话,就得了解。我在这里整理一下解决方案:。CopyOnWriterArrayList在使用上与ArrayList几乎相同。当容器执行add、remove等操作时,并不会修改原数组,而是复制原数组并在新数组上进行修改。所以对于CopyOnWriterArrayList来说,迭代过程中不会出现fail-fast现象。但CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。ConcurrentHashMap使用锁机制,是线程安全的。而是更改新数据以免影响原始数据,并在迭代器完成后替换头指针。即迭代不会fail-fast,但不能保证获得最新的数据。

集合还具有快速失败和故障安全机制。 如果想深入的话,就得了解(Java的fast fail和safe fail)。 我在这里整理一下解决方案:

1、单线程遍历时,如果要进行remove操作,可以调用迭代器的remove方法,而不是集合类的remove方法。

Java集合框架

2、使用java并发包(java.util.concurrent)中的类来替代ArrayList和HashMap。 例如,使用 CopyOnWriterArrayList 而不是 ArrayList。 CopyOnWriterArrayList在使用上与ArrayList几乎相同。 CopyOnWriter是一个写时复制容器(COW),读写时是线程安全的。 当容器执行add、remove等操作时,并不会修改原数组,而是复制原数组并在新数组上进行修改。 完成后,旧数组的引用指向新数组。 所以对于CopyOnWriterArrayList来说,迭代过程中不会出现fail-fast现象。 但CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。 对于HashMap,可以使用ConcurrentHashMap。 ConcurrentHashMap使用锁机制,是线程安全的。 在迭代方面,ConcurrentHashMap采用了不同的迭代方法。 在此迭代方法中,当创建迭代器并且更改集合时,不再抛出 ConcurrentModificationException。 而是更改新数据以免影响原始数据,并在迭代器完成后替换头指针。 对于新数据,使得迭代器线程可以使用原来的旧数据,写入线程也可以并发完成更改。 即迭代不会fail-fast,但不能保证获得最新的数据。

张超红137

251***

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]