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
此方法返回由指定列表支持的同步线程安全列表。
建议我们在通过 Iterator
、 Spliterator
或者 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中,ArrayList 是非同步集合,不应该在没有显式同步的并发环境中使用。
为了同步 ArrayList ,我们可以使用两个 JDK 提供的方法。
- Collections.synchronizedList() 方法 - 它返回由指定列表支持的同步列表。
- CopyOnWriteArrayList 类 - 它是 ArrayList 的线程安全变体。
日期:2020-09-17 00:09:27 来源:oir作者:oir