when do add or remove or somthing else ,then it would copy .
https://www.cnblogs.com/dolphin0520/p/3938914.html
文章中说到了一点比较蛋疼的点:
数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。
下面评论区也讨论了起来。
如果代码是:
CopyOnWriteArrayList c = new CopyOnWriteArrayList();
c.add(new Object());
c.get(0);
那么绝对不会有问题
如果是
CopyOnWriteArrayList c = new CopyOnWriteArrayList();
c.add(new Object());
Thread t1 =new Thread(new Runable(){
public void run(){
c.get(0);
}
}) ;
Thread t2 =new Thread(new Runable(){
public void run(){
c.set(0,new Object());
}
}) ;
t1.start();
t2.start();
那这个场景是怎么可能才会这么用?如果用的话,这样是有一定概率发生获取到旧的数据的。
但是其实文章的作者的意思是:
在进行便利的时候,是获取的
i1 = c.Iterator() 这里面的elments指向的数据为 A
c.add(new a)的时候,会做一次copy,然后把elemts的指针进行替换,使得最后的数据指向的数据 B. 而之前的任何操作,他们的getArray() 都是 A.所以 i1里面永远不知道 c.的存在。
网友评论