CopyOnWriteArrayList

2018-05-26  本文已影响11人  IAmWhoAmI

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.的存在。

上一篇下一篇

猜你喜欢

热点阅读