如果我们使用Collections.synchrnizedList(Collection c),则同步遍历块的目的是什么?
我正在使用Collections.synchronizedList()方法来获取arrayList的同步版本,那么为什么要把遍历arraylist放在一个同步块中呢?
因此,我正在阅读有关如何使arraylist同步的教程。我遇到了以下代码行。
导入java.util。*;
class GFG
{
public static void main (String[] args)
{
List<String> list =
Collections.synchronizedList(new ArrayList<String>());
list.add("practice");
list.add("code");
list.add("quiz");
synchronized(list)
{
// must be in synchronized block
Iterator it = list.iterator();
while (it.hasNext())
System.out.println(it.next());
}
}
}
我的问题是为什么我们要同步遍历? 即使有两个线程同时遍历,并且两个线程都试图同时在结构上修改数组,如果一个线程正在添加元素,也不会bcz不会锁定同步的arraylist吗?
答案 0 :(得分:1)
如果在创建迭代器后修改了列表,则ArrayList
返回的迭代器将以ConcurrentModificationException
失败。因此,代码在迭代时阻止对列表的修改。根据{{3}}文档:
此类的迭代器和listIterator返回的迭代器 方法是快速失败的:如果列表在结构上有任何修改 创建迭代器之后的时间,除了通过 迭代器自己的remove或add方法,迭代器会抛出一个 ConcurrentModificationException。因此,面对并发 修改后,迭代器会快速干净地失败,而不是 在不确定的时间冒任意,不确定的行为的风险 将来。
并非所有List
实现都具有此特定行为。例如,使用ArrayList
并发修改时迭代不会失败。