首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解CopyOnWriteArrayList迭代器行为

理解CopyOnWriteArrayList迭代器行为
EN

Stack Overflow用户
提问于 2019-08-07 07:28:16
回答 1查看 104关注 0票数 1

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

我的主要方法如下:

代码语言:javascript
复制
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之前--在访问或删除之后的操作之前,线程中的操作会发生”。

但是我的控制台输出是:

代码语言:javascript
复制
Init1
Init2
Init3
Init4

我相信,我对此缺乏一些了解。有人能帮忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-07 07:53:34

从文件中

“快照”样式迭代器方法在迭代器创建时使用对数组状态的引用。这个数组在迭代器的生存期内不会改变,因此不可能发生干扰,并且保证迭代器不会抛出ConcurrentModificationException。迭代器将不会反映自迭代器创建以来对列表的添加、删除或更改。

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57389068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档