深入浅析Java中并发集合的CopyOnWriteArrayList

  介绍

深入浅析Java中并发集合的CopyOnWriteArrayList ?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

它相当于线程安全的ArrayList。和ArrayList一样,它是个可变数组;但是和ArrayList不同的时,它具有以下特性:

1。它最适合于具有以下特征的应用程序:列表大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。

2。它是线程安全的。

3。因为通常需要复制整个基础数组,所以可变操作(添加(),()和remove()等等)的开销很大。

4。迭代器支持hasNext ()、next()等不可变操作,但不支持可变删除()等操作。

5。使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照只

CopyOnWriteArrayList的数据结构,如下图所示:

深入浅析Java中并发集合的CopyOnWriteArrayList

1。CopyOnWriteArrayList实现了列表接口,因此它是一个队列。

2。CopyOnWriteArrayList包含了成员锁。每一个CopyOnWriteArrayList都和一个互斥锁锁绑定,通过锁,实现了对CopyOnWriteArrayList的互斥访问。

3。CopyOnWriteArrayList包含了成员数组数组,这说明CopyOnWriteArrayList本质上通过数组实现的。

下面从“动态数组”和“线程安全”两个方面进一步对CopyOnWriteArrayList的原理进行说明。

<强> 1只,CopyOnWriteArrayList的“动态数组”机制,——,它内部有个“挥发性数组”(阵列)来保持数据。在“添加/修改/删除“数据时,都会新建一个数组,并将更新后的数据拷贝到新建的数组中,最后再将该数组赋值给“挥发性数组”。这就是它叫做CopyOnWriteArrayList的原因! CopyOnWriteArrayList就是通过这种方式实现的动态数组;不过正由于它在“添加/修改/删除“数据时,都会新建数组,所以涉及到修改数据的操作,CopyOnWriteArrayList效率很
低;但是单单只是进行遍历查找的话,效率比较高。

<强> 2只CopyOnWriteArrayList的“线程安全“机制,——,是通过挥发性和互斥锁来实现的。(01)CopyOnWriteArrayList是通过“挥发性数组”来保存数据的。一个线程读取数波动组时,总能看到其它线程对该波动变量最后的写入;就这样,通过挥发性提供了“读取到的数据总是最新的“这个机制的

保证。(02)CopyOnWriteArrayList通过互斥锁来保护数据。在“添加/修改/删除“数据时,会先“获取互斥锁”,再修改完毕之后,先将数据更新到“数波动组”中,然后再“释放互斥锁”;这样,就达到了保护数据的目的只

//创建一个空列表。
  CopyOnWriteArrayList ()//创建一个按集合的迭代器返回元素的顺序包含指定集合元素的列的表。
  CopyOnWriteArrayList (Collection<及# 63;E>延伸;c)//CopyOnWriteArrayList (E [] toCopyIn) 

创建一个保存给定数组的副本的列表。

//将指定元素添加到此列表的尾部。
  布尔加(E E)//在此列表的指定位置上插入指定元素。
  空白添加(int指数E元素)//按照指定集合的迭代器返回元素的顺序,将指定中集合的所有元素添加此列表的尾部。
  布尔addAll (Collection<及# 63;E>延伸;c)//从指定位置开始,将指定集合的所有元素插入此列表。
  布尔addAll (int指数,Collection<及# 63;E>延伸;c)//按照指定集合的迭代器返回元素的顺序,将指定集合中尚未包含在此列表中的所有元素添加列表的尾部。
  int addAllAbsent (Collection<及# 63;E>延伸;c)//添加元素(如果不存在)。
  布尔addIfAbsent (E E)//从此列表移除所有元素。
  空白clear ()//返回此列表的浅表副本。
  对象克隆()//如果此列表包含指定的元素,则返回现实。
  布尔(包含对象o)//如果此列表包含指定集合的所有元素,则返回现实。
  布尔containsAll (Collection<及# 63;比;c)//比较指定对象与此列表的相等性。
  布尔=(对象o)//返回列表中指定位置的元素。
  E get (int指数)//返回此列表的哈希码值。
  int hashCode ()//返回第一次出现的指定元素在此列表中的索引,从指数开始向前搜索,如果没有找到该元素,则返回1。
  int indexOf (E E, int指数)//返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回1。
  int indexOf(对象o)//如果此列表不包含任何元素,则返回现实。
  布尔isEmpty ()//返回以恰当顺序在此列表元素上进行迭代的迭代器。
  Iterator

深入浅析Java中并发集合的CopyOnWriteArrayList