java - 了解 CopyOnWriteArrayList 迭代器行为

标签 java copyonwritearraylist

我正在研究 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 中:

Memory consistency effects: As with other concurrent collections, actions in a thread prior to placing an object into a CopyOnWriteArrayList happen-before actions subsequent to the access or removal of that element from the CopyOnWriteArrayList in another thread.

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

但是我的控制台输出是:

Init1
Init2
Init3
Init4

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

最佳答案

来自文档

The "snapshot" style iterator method uses a reference to the state of the array at the point that the iterator was created. This array never changes during the lifetime of the iterator, so interference is impossible and the iterator is guaranteed not to throw ConcurrentModificationException. The iterator will not reflect additions, removals, or changes to the list since the iterator was created

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

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

关于java - 了解 CopyOnWriteArrayList 迭代器行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57389068/

相关文章:

java - 保存实际进度progressBar onSaveInstanceState

java - 恢复应用程序后上下文为空

java - 同时合并列表 - CopyOnWriteArrayList 或 ConcurrentLinkedQueue 哪个更好?

java - 如何在java中对ArrayList的ArrayList进行排序?

java - 在不提供 writeObject/readObject 方法的情况下实现 Serializable

java - 为什么 CopyOnWriteArrayList 与迭代不可修改列表不同?

java - CopyOnWriteArrayList 太慢

java - 为什么CopyOnWriteArrayList中没有这样的removeRange()方法?

java - 如果使用 SwingWorker 加载数据,何时将 TabelModel 绑定(bind)到 JTable?

java - 为什么CopyOnWriteArrayList在写入时会复制?