首页 > 其他分享 >CopyOnWriteArrayList

CopyOnWriteArrayList

时间:2024-03-05 23:33:21浏览次数:19  
标签:iterator CopyOnWrite list CopyOnWriteArrayList 互斥 add

CopyOnWriteArrayList

目录

CopyOnWriteArrayList诞生记

  • 代替Vector和SynchronizedList,就像ConcurrentHashMap代替SynchronizedMap的原因一样
  • Vector和SynchronizedList的锁的粒度太大,并发效率相对比较低,并且迭代时无法编辑
  • Copy-On-Write并发容器还包括CopyOnWriteArraySet,用来替代同步Set

CopyOnWriteArrayList使用场景

  • 读操作可以尽可能地快,而写即使慢一点也没有太大关系。
    • 读多写少:黑名单,每日更新;监听器:迭代操作远多于修改操作

CopyOnWriteArrayList读写操作

  • 回顾读写锁:读读共享、其他都互斥(写写互斥、读写互斥、写读互斥)
  • 读写锁规则的升级:读取是完全不用加锁的,并且更厉害的是,写入也不会阻塞读取操作。只要写入和写入之间需要进行同步等待。
public class CopyOnWriteArrayListDemo1 {
    public static void main(String[] args) {
//        ArrayList<String> list = new ArrayList<>();
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println("list is "+list);
            String next = iterator.next();
            System.out.println(next);
            if(next.equals("2")){
                list.remove("5");
            }

        }
    }
}

实现原理

ArryaList之所以报错原因是

final void checkForComodification() {
    // expectedModCount 为创建迭代器时的值
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
  • CopyOnWrite的含义:拷贝一份数据到新的内存,将指针指向新的地址
    • 创建新副本、读写分离
    • “不可变”原理
    • 迭代的时候可能会出现数据过期问题

缺点

  • 数据一致性问题:CopyOnWrite容器只能保证数据的最终-致性,不能保证数据的实时一致性。所以如果你希望写入的数据,马上能读到,请不要使用CopyOnWrite容器:
  • 内存占用问题:因为CopyOnWrite的写是复制机制,所以在进行写操作的时候,内存里会同时驻扎两个对象的内存。

源码分析

  • 数据结构
  • get():可以看到,get方法直接获取元素信息

image-20240305230534832

  • set():加Lock锁,同时拷贝一份新的数组,将set的值放置新数组最后一个元素位置

image-20240305230648217

标签:iterator,CopyOnWrite,list,CopyOnWriteArrayList,互斥,add
From: https://www.cnblogs.com/shine-rainbow/p/18055553

相关文章

  • 并发容器【ConcurentHashMap、CopyOnWriteArrayList、阻塞队列、ArrayBlockingQueue】
    (并发容器)转自极客时间什么是并发容器?在JUC包中,有一大部分是关于并发容器的,如ConcurrentHashMap,ConcurrentSkipListMap,CopyOnWriteArrayList及阻塞队列。这里将介绍使用频率、面试中出现频繁的最高的ConcurrentHashMap和阻塞队列。注意:这里说到的容器概念,相当于我们理解中......
  • 【并发编程】CopyOnWriteArrayList详解与原理
    ......
  • 线程安全集合(JDK1.5之前和之后)、CopyOnWriteArrayList、CopyOnWriteArraySet
    JDK1.5之前JDK1.5之前:Collections.synchronizedList JDK1.5之后CopyOnWriteArrayList   CopyOnWriteArraySet    ......
  • JUC高并发容器-CopyOnWriteArrayList
    CopyOnWriteArrayListJUC高并发容器线程安全的同步容器类什么是高并发容器?CopyOnWriteArrayListJUC高并发容器线程安全的同步容器类  Java同步容器类通过Synchronized(内置锁)来实现同步的容器,比如Vector、HashTable以及SynchronizedList等容器。线程安全的同步容器类主要有Vec......
  • jdk并发包 CopyOnWriteArrayList源码分析
    CopyOnWriteArrayList是jdk1.5并法包里面用于处理高并发下,读多写少的情况下,降低锁等待的集合类。下面对该类实现做一个简要的分析1,首先CopyOnWriteArrayList是实现了List接口,对=List接口的相关方法进行了实现。2,下面的它的add方法,会首先加锁,然后copy原List内部的数组,然后对新数组长......
  • 【Java 并发】【十】【JUC数据结构】【一】CopyOnWriteArrayList原理
    1 前言我们前面看过了volatile、synchronized以及AQS的底层原理,以及基于AQS之上构建的各种并发工具,ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier,那么我们这节该看什么了,是不是要看运用了。在日常的业务编程中经常使用到的内存数据结构有:Map、Set、List、Queue系列......
  • JUC-CopyOnWriteArrayList
    packagesyn;importjava.util.concurrent.CopyOnWriteArrayList;publicclassTestJUC{publicstaticvoidmain(String[]args){CopyOnWriteArrayListlist=new......
  • CopyOnWriteArrayList
    底层首先 CopyOnWriteArrayList内部也是通过数组来实现的,在向 CopyOnWriteArrayList添加元素时,会复制一个新的数组,写操作在新数组上进行,读操作在原数组上进行并且,写......
  • 线程安全集合CopyOnWriteArrayList
    解决多线程的集合有以下几种1、Vertor(所有方法上加synchronized锁)能保证多线程安全,数据一致,但性能低下一般不用2、Collections.synchronizedList方法返回的List 在方......
  • 并发容器之CopyOnWriteArrayList
    Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一......