美文网首页
CopyOnWriteArrayList

CopyOnWriteArrayList

作者: IAmWhoAmI | 来源:发表于2018-05-26 12:38 被阅读11次

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

    相关文章

      网友评论

          本文标题:CopyOnWriteArrayList

          本文链接:https://www.haomeiwen.com/subject/tmkmjftx.html