zoukankan      html  css  js  c++  java
  • CopyOnWriteArrayList使用

    1、在遍历操作数量大大超过可变操作是(add,set等等)使用。原因是其可变操作是通过对底层数据进行一次新的复制来实现的。

    2、迭代器创建后,其不会反应列表的添加、移除或更改。其迭代器是”快照“风格的,其创建使用了对数组状态的引用,此数组在迭代器的生存期内不会更改;如在迭代器上进行元素更改操(remove、set、add)作,将会抛出UnsupportedOperationException.

    3、内存一致性效果:当存在其他并发 collection 时,将对象放入 CopyOnWriteArrayList 之前的线程中的操作 happen-before 随后通过另一线程从 CopyOnWriteArrayList 中访问或移除该元素的操作。 

    4、在进行并发编程时,跳异常:

    Caused by: java.lang.ClassCastException: java.util.concurrent.CopyOnWriteArrayList$COWSubList cannot be cast to java.util.concurrent.CopyOnWriteArrayList

    一开始觉得很奇怪,细看后问题出在:

    CopyOnWriteArrayList<Long> list;
    .....
    CopyOnWriteArrayList<Long> list1= (CopyOnWriteArrayList<Long>)list.subList(i*len, ((i+1)*len>list.size())?(list.size()):((i+1)*len));

    一方面使用了subList()子函数返回List<E>,得进行类型转换;另一方面该函数返回列表list的部分视图,返回列表list1受list支持,list已经为CopyOnWriteArrayList。这就导致矛盾,也就导致上面奇怪的报错!

    修改方法为:

    CopyOnWriteArrayList<Long> list1= new CopyOnWriteArrayList<Long>(); //重新创建一个CopyOnWriteArrayList,而不是原列表视图,如果需要列表修改反应到原列表上,那就不能使用subList函数了
    list1.addAll(list.subList(i*len, ((i+1)*len>list.size())?(list.size()):((i+1)*len)));//

    注意:如果通过返回列表以外的其他任何方式从结构上修改 底层实现列表(如上list),则此方法返回的列表语义将是不确定的。(从结构上修改是指更改列表的大小,或者以其他方式打乱列表,使正在进行的迭代生成错误的结果。)

  • 相关阅读:
    在eclipse中安装 Activiti Designer插件
    Maven settings.xml配置(指定本地仓库、阿里云镜像设置)
    unity调用MMBilling_2.4.2 Android SDK.
    unity与Android相互调用
    Unity3D研究院之与Android相互传递消息
    Unity3D研究院之打开Activity与调用JAVA代码传递参数
    Objec c 字符串比较
    判断不同IOS设备
    Unity3D研究院之IOS本地消息通知LocalNotification的使用
    【Unity3D】iOS 推送实现
  • 原文地址:https://www.cnblogs.com/tutar/p/3649611.html
Copyright © 2011-2022 走看看