欢迎来到之路教程(on itroad-com)

CopyOnWriteArrayList 示例

CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList<>(new Integer[] {1,2,3});
System.out.println(list);	//[1, 2, 3]
//Get iterator 1
Iterator<Integer> itr1 = list.iterator();
//Add one element and verify list is updated
list.add(4);
System.out.println(list);	//[1, 2, 3, 4]
//Get iterator 2
Iterator<Integer> itr2 = list.iterator();
System.out.println("====Verify Iterator 1 content====");
itr1.forEachRemaining(System.out :: println);	//1,2,3
System.out.println("====Verify Iterator 2 content====");
itr2.forEachRemaining(System.out :: println);	//1,2,3,4

输出:

[1, 2, 3]
[1, 2, 3, 4]
====Verify Iterator 1 content====
1
2
3
====Verify Iterator 2 content====
1
2
3
4

CopyOnWriteArrayList 功能

  • CopyOnWriteArrayList 类实现了 List 和 RandomAccess 接口,因此提供了 ArrayList 类中可用的所有功能。
  • 使用 CopyOnWriteArrayList 的更新操作代价高昂,因为每个突变都会创建底层数组的克隆副本并向其添加/更新元素。
  • 它是 ArrayList 的线程安全版本。访问列表的每个线程都会看到它自己版本的在初始化此列表的迭代器时创建的后备数组的快照。
  • 因为它在创建迭代器时获取底层数组的快照,所以它不会抛出 ConcurrentModificationException 。
  • 不支持迭代器上的变异操作(移除、设置和添加)。这些方法抛出 UnsupportedOperationException
  • CopyOnWriteArrayList 是同步 List 的并发替代品,并在迭代数量超过突变时提供更好的并发性。
  • 它允许重复元素和异构对象(使用泛型来获取编译时错误)。
  • 因为它每次创建迭代器时都会创建一个新的数组副本,所以性能比 ArrayList 慢。

CopyOnWriteArrayList 层次结构

CopyOnWriteArrayList类实现了以下接口 List、RandomAccess、Cloneable 和 Serializable。

public class CopyOnWriteArrayList<E>
    implements 	List<E>, 
    			RandomAccess, 
    			Cloneable, 
    			Serializable 
{
	private transient volatile Object[] array;
	//implementation
}

CopyOnWriteArrayList 的方法

CopyOnWriteArrayList 类 ArrayList 类中支持的所有方法。
只有在迭代器(快照迭代器)和在列表中的突变期间创建的新支持数组的情况下,行为才不同。

此外,它还提供了一些添加到此类的方法。

  • boolean addIfAbsent(object o) :如果不存在则追加元素。
  • int addAllAbsent(Collection c) :按照指定集合的迭代器返回的顺序,将指定集合中尚未包含在此列表中的所有元素添加到此列表的末尾。

对于支持的所有其他方法,请访问 ArrayList 方法部分。

CopyOnWriteArrayList 的构造函数

  • CopyOnWriteArrayList() :创建一个空列表。
  • CopyOnWriteArrayList(Collection c) :创建一个包含指定集合元素的列表,按照集合迭代器返回的顺序。
  • CopyOnWriteArrayList(object[] array) :创建一个包含给定数组副本的列表。
Java CopyOnWriteArrayList

Java CopyOnWriteArrayList 是 ArrayList 的线程安全变体,其中所有可变操作(添加、设置等)都是通过创建底层数组的新副本来实现的。

它是不可变的快照样式迭代器方法,它使用对创建迭代器时数组状态的引用。

当遍历操作远远超过列表更新操作并且我们不想同步遍历并且在更新列表时仍然希望线程安全时很有用。

日期:2020-09-17 00:09:46 来源:oir作者:oir