当前位置: 首页 > 面试题库 >

失败的安全迭代器和弱一致性迭代器

冀景明
2023-03-14
问题内容

失败安全迭代器是那些不会失败的迭代器throw ConcurrentModificationException

但是fail safe iterators和之间有什么区别weakly consistent iterators

都一样吗


问题答案:

无论Fail-safeWeakly consistent迭代器不乱扔ConcurrentModificationException

weakly consistent iterators: 依赖CAS( compare-and-swap
)的集合具有弱一致性的迭代器,该迭代器反映了自创建以来对其后备集合进行的部分更改,但不一定反映所有更改。例如,如果集合中的元素在迭代器到达之前已被修改或删除,则它肯定会反映出这些更改,但对插入没有任何保证。

Fail safe iterator
迭代器机制复制内部Collection数据结构,并使用它对元素进行迭代。如果基础数据结构发生更改,这可以防止引发任何并发修改异常。当然,引入了复制整个阵列的开销。

CopyOnWriteArrayList Fail安全迭代器就是这样的一种实现,通过查看构造函数的源代码,我们可以很容易地看到它:

public CopyOnWriteArrayList(Collection<? extends E> c) {
        Object[] elements = c.toArray();

        if (elements.getClass() != Object[].class)
            elements = Arrays.copyOf(elements, elements.length, Object[].class);
        setArray(elements);
    }

参考:

  1. Java Generics and Collections: 11.5. Collections and Thread Safety
  2. Iterators – Fail fast Vs Fail safe


 类似资料:
  • 我了解快速故障(LinkedList)和故障安全(复制写入)迭代器,但是弱一致性仍然是一个谜。 文档说它可能反映了基础集合的变化,但不能保证。所以我假设弱一致性不会创建支持集合的副本。(在并发Map中,它在同一个存储桶数组上工作)。 我假设如果线程A创建了一个迭代器并完成了一半,当线程B将一个项目放入数组开头的存储桶时,这个更改对线程A的迭代器不可见。 如果 B 将该项放在数组的末尾,则 A 会看

  • 问题内容: 我了解故障快速(LinkedList)和故障安全(copyonwrite)迭代器,但是弱一致性仍然是个谜。 文档说它可能反映了基础馆藏的变化,但不能保证。因此,我认为弱一致性不会创建后备集合的副本。(在并发Map中,它可在同一bucketarray上运行)。 我假设线程A创建了一个迭代器并进行了一半,当线程B将一个项目放到数组开头的存储桶中时,线程A的迭代器将看不到该更改。 如果B将该

  • 我将获取一个用户列表作为数组,对数据进行分页,并以表格的形式显示在视图中。 为了迭代数组,我使用 foreach 循环。但是我的前循环迭代不起作用。 这是一个示例数组,当我执行< code>print_r()时,我有< code>id、< code>email和< code>full_name字段,我想在视图中显示它们 这是我迭代数组的视图部分。结果存储在< code>$userList中。这个数

  • 迭代器 乍看来,迭代器似乎很直观。但凑近了看,你会发现标准STL容器提供了四种不同的迭代器:iterator、const_iterator、reverse_iterator和const_reverse_iterator。很快你会注意到在这四种类型中,容器的insert和erase的某些形式只接受其中一种。那是问题的开始。为什么有四种迭代器?它们之间的关系是什么?它们可以互相转化吗?在调用算法和ST

  • For freedom Christ has set us free. Stand firm, therefore, and do not submit again to a yoke of slavery. 基督释放了我们,叫我们得以自由,所以要站立得稳,不要再被奴仆的轭挟制。(GALATIANS 5:1) 迭代器 迭代,对于读者已经不陌生了,曾有专门一节来讲述,如果印象不深,请复习《迭代》。

  • 在Rust中,迭代器共分为三个部分:迭代器、适配器、消费者。 其中,迭代器本身提供了一个惰性的序列,适配器对这个序列进行诸如筛选、拼接、转换查找等操作,消费者则在前两者的基础上生成最后的数值集合。 但是,孤立的看这三者其实是没有意义的,因此,本章将在一个大节里联系写出三者。 迭代器、适配器、消费者