CopyOnWriteArrayList
源码解析转载自:
https://www.cnblogs.com/leesf456/p/5547853.html
总结:
1:线程安全,读操作时无锁,相当于的ArrayList。
2:底层数据结构是一个Object[],初始容量为0,之后每增加一个元素,容量+1,数组复制一遍。
3:增删改上锁、读不上锁。
4:遍历过程由于遍历的只是全局数组的一个副本,即使全局数组发生了增删改变化,副本也不会变化,所以不会发生并发异常(concurrentModificationException)。(即当一个集合进行遍历的时候,同时对集合进行增删改,不会发生并发异常。例如ArrayList会发生该问题)
5:读多写少且脏数据影响不大的并发情况下,选择CopyOnWriteArrayList。
question1:get(int)操作会发生脏读,为什么?
一个线程正在进行对集合的添加,此时会copy一个数组的副本进行处理,当写入完毕之后,会将引用从原数组指向新数组。若在引用的指向过程中,即操作add的线程还未进行指向新数据之前,此时另外一个线程进行对集合的get操作(读操作),则此时会发生脏读。
Copy-On-Write容器介绍转载自:
http://ifeve.com/java-copy-on-write/
使用CopyOnWriteArrayList需要注意两件事情:
1:减少初始化扩容开销。根据实际需要,初始化CopyOnWriteArrayList的大小,避免第一次写时CopyOnWriteArrayList扩容的开销。
2:使用批量添加。因为每次添加,容器每次都会进行复制,所以减少添加次数,可以减少容器的复制次数。如使用上面代码里的addBlackList方法。
Copy-On-Write容器缺点:
1:内存占用问题。因为增删改数据时,会复制一个副本进行处理。内存中会存在两份,造成内存开销。
2:数据一致性问题。CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。所以如果你希望写入的的数据,马上能读到,请不要使用CopyOnWrite容器。
Collections.synchronizedList(ArrayList)。将ArrayList变成线程安全的类,即将该类+synchronized同步关键字进行处理。
Collections里面的synchronizedList的源码:
public static <T> List<T> synchronizedList(List<T> list) {
return (list instanceof RandomAccess ?
new SynchronizedRandomAccessList<T>(list) :
new SynchronizedList<T>(list));//根据不同的list类型最终实现不同的包装类。
}
static class SynchronizedList<E>
extends SynchronizedCollection<E>
implements List<E> {
private static final long serialVersionUID = -7754090372962971524L;
final List<E> list;
SynchronizedList(List<E> list) {//new SynchronizedList<T>(list))指向的 方法
super(list);
this.list = list;
}
Collections.synchronizedList(ArrayList)和CopyOnWriteArrayList比较:
转载自:
https://www.cnblogs.com/yan456jie/p/5369366.html
CopyOnWriteArrayList和Collections.synchronizedList(ArrayList)是实现线程安全的列表的两种方式。两种实现方式分别针对不同情况有不同的性能表现,其中CopyOnWriteArrayList的写操作性能较差,而多线程的读操作性能较好。而Collections.synchronizedList的写操作性能比CopyOnWriteArrayList在多线程操作的情况下要好很多,而读操作因为是采用了synchronized关键字的方式,其读操作性能并不如CopyOnWriteArrayList。因此在不同的应用场景下,应该选择不同的多线程安全实现类。
CopyOnWriteArrayList,发生修改时候做copy,新老版本分离,保证读的高性能,适用于以读为主,读操作远远大于写操作的场景中使用,比如缓存。而Collections.synchronizedList则可以用在CopyOnWriteArrayList不适用,但是有需要同步列表的地方,读写操作都比较均匀的地方。
Collections.SynchronizedList(ArrayList)和Vector的区别:
转载自:
http://blog.csdn.net/dviewer/article/details/52970896
1:SynchronizedList有很好的扩展和兼容功能。他可以将所有的List的子类转成线程安全的类。
(若当SynchronizedList包装ArrayList时,ArrayList变成线程安全的类,但是扩容机制和Vector不同,SynchronizedList(ArrayList)和ArrayList的扩容机制相同)
2:使用SynchronizedList的时候,进行遍历时要手动进行同步处理。并没有对interator( )方法+synchronized同步关键字。
官方文档解释例子:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized (list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
i.next();
}
3:SynchronizedList可以指定锁定的对象。SynchronizedList使用的synchronized同步代码块,Vector使用的是synchronized同步方法,同步代码块的同步粒度更小,效率更高。
补充:同步代码块和同步方法的区别:
1:同步代码块在锁定的范围上可能比同步方法要小,一般来说锁的范围大小和性能是成反比的。 ---同步代码块性能更好
2:同步块可以更加精确的控制锁的作用域(锁的作用域就是从锁被获取到其被释放的时间),同步方法的锁的作用域就是整个方法。
3:静态代码块可以选择对哪个对象加锁,但是静态方法只能给this对象加锁。
CopyOnWriteArrayList和CopyOnWriteArraySet的区别:
就是相当于list和set的区别。list可以允许重复,set不允许重复。
分享到:
相关推荐
Java并发容器CopyOnWriteArrayList实现原理及源码分析 Java并发容器CopyOnWriteArrayList是Java并发包中提供的一个并发容器,实现了线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现。...
Java中的`CopyOnWriteArrayList`是一个线程安全的列表实现,特别适合于高并发环境下的读多写少的场景。这个类的名字暗示了其工作原理:在修改(写入)时复制原有的数组,然后在新的数组上进行操作,最后将新数组替换...
java遍历时可修改的容器CopyOnWriteArrayList
在Java的并发编程中,CopyOnWriteArrayList 是一个重要的线程安全集合类,它通过写时复制(Copy-On-Write)机制实现了高效的读操作。本文将详细探讨 CopyOnWriteArrayList 的工作原理、优缺点、适用场景以及代码示例...
CopyOnWriteArrayList是Java集合框架中的一个特殊列表,位于`java.util.concurrent`包下,专为并发编程场景设计。它的核心特性在于写时复制(Copy-On-Write)策略,这使得它在多线程环境下提供了良好的性能表现。当...
在Java中,CopyOnWriteArrayList(写入时复制数组列表)是线程安全的集合类,它实现了List接口,并使用了"写入时复制"的策略来保证线程安全性。 CopyOnWriteArrayList的主要特点是:在进行修改操作(例如添加、修改...
### Java多线程与并发(14-26)-JUC集合-CopyOnWriteArrayList详解 #### 一、概述 `CopyOnWriteArrayList`是一种线程安全的集合类,它是`ArrayList`的一种特殊版本,主要通过复制底层数组的方式来保证线程安全性。...
CopyOnWriteArrayList并发容器 CopyOnWriteArrayList是一种基于Copy-On-Write机制的并发容器,自JDK 1.5开始提供。它的基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把...
Java源码解析CopyOnWriteArrayList的讲解 Java源码解析CopyOnWriteArrayList是Java集合框架中一个非常重要的组件,它提供了一个线程安全的ArrayList变种,用于处理大量读取操作和少量写入操作的场景。在本文中,...
1. CopyOnWriteArrayList的简介 2. COW的设计思想 3. CopyOnWriteArrayList的实现原理 4. 总结 2.读线程间
Java concurrency集合之 CopyOnWriteArrayList_动力节点Java学院整理,动力节点口口相传的Java黄埔军校
CopyOnWriteArrayList是Java集合框架中的一个重要类,它是ArrayList的线程安全版本,特别适合于读多写少的并发场景。这个类通过一种称为“写时复制”(Copy-On-Write)的技术实现了读写分离,确保了在进行写操作时不会...
3. **并发容器**:书中详细讨论了`java.util.concurrent`包下的并发容器,如`ConcurrentHashMap`、`CopyOnWriteArrayList`和`BlockingQueue`等。这些容器设计为线程安全,可以提高多线程环境下的性能。 4. **并发...
目前上传的是CopyOnWriteArrayList.uml类图,包含该类的各个extends、implements的接口或者类
java中,List在遍历的时候,如果被修改了会抛出java.util.ConcurrentModificationException错误。 看如下代码: import java.util.ArrayList; import java.util.List; public class Resource3 { ...
ArrayList 是我们常用的工具类之一,但是在多线程的情况下,ArrayList 作为共享变量时,并不是线程安全的。主要有以下两个原因: 1、ArrayList 自身的 ...用 JUC 下的 CopyOnWriteArrayList ; 先来看看 Synchron
今天不看源码(想看源码的同学可以自己在本机进行查阅),只是大概说一下这三者的区别。方便大家能够在面试的时候说出这三者的不同。 ArrayList方面 ArrayList简介: ArrayList是一种以数组实现的List,它实现了...
《CopyOnWriteArrayList与CopyOnWriteArraySet源码解析》 CopyOnWriteArrayList与CopyOnWriteArraySet是Java集合框架中的两种线程安全的数据结构,它们在多线程环境下提供了高效且安全的操作。这两个类源自于`java....