zoukankan      html  css  js  c++  java
  • JAVA 笔记 CopyOnWriteArrayList

          在写代码时遇到了一个ConcurrentModificationException异常,百度了下发现是因为在使用Iterator遍历时原数据发生了变化导致的。

    业务的需求如下:

          有一个数据监听器列表,当系统收到数据时遍历列表中的每一项并发送数据。当遍历的过程中有可以会新增或删除相应的监听器。

          这种情况下可以使用CopyOnWriteArrayList 来实现监听器列表。

          原理如下:

                  JAVA中将引用从一个对象移到另外一个对象不需要消耗CPU时间,可以看做是一个原子操作。

                  JAVA中如果一个对象仍旧存在引用,则不会被CG回收。      

    CopyOnWriteArrayList就是根据以上两个特点,在列表有更新时直接将原有的列表复制一份,并再新的列表上进行更新操作,完成后再将引用移到新的列表上。旧列表如果仍在使用中(比如遍历)则继续有效。如此一来就不会出现修改了正在使用的对象的情况(读和写分别发生在两个对象上),同时读操作也不必等待写操作的完成,免去了锁的使用加快了读取速度。

          另:CopyOnWriteArrayList 在写的时候需要复制整个数组,所以在这个操作上比较耗时,不太适合写频繁的业务。


          

  • 相关阅读:
    hdu 3790 最短路径问题
    hdu 2112 HDU Today
    最短路问题 以hdu1874为例
    hdu 1690 Bus System Floyd
    hdu 2066 一个人的旅行
    hdu 2680 Choose the best route
    hdu 1596 find the safest road
    hdu 1869 六度分离
    hdu 3339 In Action
    序列化和反序列化
  • 原文地址:https://www.cnblogs.com/yjl49/p/2446031.html
Copyright © 2011-2022 走看看