我正在学习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我相信,我对此缺乏一些了解。有人能帮忙吗?
发布于 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-循环开始时打印列表中的元素,因为此时迭代器已经创建。
https://stackoverflow.com/questions/57389068
复制相似问题