【问题标题】:Understanding CopyOnWriteArrayList iterator behavior了解 CopyOnWriteArrayList 迭代器行为
【发布时间】:2019-08-07 07:28:16
【问题描述】:

我正在学习CopyOnWriteArrayList,下面的情况让我开始思考。

我的主要方法是这样的:

public static void main(String[] args) {
    List<String> list = new CopyOnWriteArrayList<String>();
    list.add("Init1");
    list.add("Init2");
    list.add("Init3");
    list.add("Init4");

    for(String str : list){
        System.out.println(str);
        list.add("PostInit");
    }   
}

在我阅读的 javadoc 中:

内存一致性影响:与其他并发集合一样,线程中的操作在将对象放入 CopyOnWriteArrayList 之前发生在另一个线程中从 CopyOnWriteArrayList 访问或删除该元素之后的操作。

我期待一个无限循环,因为“在将对象放入 CopyOnWriteArrayList 之前线程中的操作发生在访问或删除之后的操作之前”

但我的控制台输出是:

Init1
Init2
Init3
Init4

我相信,我在这里缺乏一些了解。有人可以帮忙吗?

【问题讨论】:

    标签: java copyonwritearraylist


    【解决方案1】:

    来自文档

    “快照”样式迭代器方法使用对状态的引用 创建迭代器时的数组。这个数组从不 在迭代器的生命周期中发生变化,因此干扰是 不可能,并且保证迭代器不会抛出 并发修改异常。迭代器不会反映 自迭代器被添加、删除或更改列表 已创建

    for-each 循环正在使用迭代器,请参阅https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14.2

    因此,for-each 循环将在 for 循环开始时打印列表中的元素,因为它是在创建迭代器的那一刻。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 2019-02-27
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多