on  it road.com

隐式线程安全的 CopyOnWriteArrayList

CopyOnWriteArrayList 是 ArrayList 的线程安全变体,其中所有可变操作(添加、设置等)都是通过创建底层数组的新副本来实现的。
当我们不能或者不想同步数组列表的遍历时,此类非常有用。
它是线程安全 Java 集合的一部分。

此类使用“快照”样式的迭代器方法。
它使用对创建迭代器时后备数组状态的引用。
这个数组在迭代器的生命周期内永远不会改变。

自创建迭代器以来,迭代器不会反映对列表的添加、删除或者更改。
不支持迭代器本身的元素更改操作(删除、设置和添加)。

CopyOnWriteArrayList<String> namesList = new CopyOnWriteArrayList<String>();
//List methods are synchronized
namesList.add("JackLi");
namesList.add("BobRobert");
//No explicit synchronization is needed during iteration
Iterator<String> iterator = namesList.iterator(); 
while (iterator.hasNext()) 
{
	System.out.println(iterator.next());
}

输出:

JackLi
BobRobert

使用 Collections.synchronizedList() 同步ArrayList

此方法返回由指定列表支持的同步线程安全列表。
建议我们在通过 IteratorSpliterator或者 Stream遍历返回的列表时手动同步它。

否则,它可能会导致非确定性行为。

从同步的数组列表中添加、删除元素不需要显式同步。

List<String> namesList = Collections.synchronizedList(new ArrayList<String>());
//List methods are synchronized
namesList.add("JackLi");
namesList.add("BobRobert");
//Use explicit synchronization while iterating
synchronized(namesList) 
{
	Iterator<String> iterator = namesList.iterator(); 
	while (iterator.hasNext()) 
	{
		System.out.println(iterator.next());
	}
}

输出:

JackLi
BobRobert
Java如何同步数组列表

在Java中,ArrayList 是非同步集合,不应该在没有显式同步的并发环境中使用。

为了同步 ArrayList ,我们可以使用两个 JDK 提供的方法。

  • Collections.synchronizedList() 方法 - 它返回由指定列表支持的同步列表。
  • CopyOnWriteArrayList 类 - 它是 ArrayList 的线程安全变体。
日期:2020-09-17 00:09:27 来源:oir作者:oir