abj*_*305 1 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");
}
}
Run Code Online (Sandbox Code Playgroud)
在javadoc中,我读到:
内存一致性影响:与其他并发集合一样,在将对象放入CopyOnWriteArrayList之前在线程中执行的操作发生在访问或从另一个线程中的CopyOnWriteArrayList删除该元素之后的操作之前。
我一直期待一个无限循环,因为“在将对象放入CopyOnWriteArrayList之前,线程中的操作发生在访问或删除之后的操作之前”。
但是我的控制台输出是:
Init1
Init2
Init3
Init4
Run Code Online (Sandbox Code Playgroud)
我相信,我在这里缺乏了解。有人可以帮忙吗?
小智 7
从文档中
“快照”样式的迭代器方法在创建迭代器时使用对数组状态的引用。此数组在迭代器的生命周期内永不更改,因此不可能发生干扰,并且保证迭代器不会引发ConcurrentModificationException。自创建迭代器以来,该迭代器将不会反映对该列表的添加,删除或更改
for-each循环正在使用迭代器,请参见https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.14.2。
因此,for-each循环将在for循环开始时打印列表中的元素,因为它是在那时创建迭代器的。
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |