如果我们使用Collections.synchrnizedList(Collection c),则同步遍历块的目的是什么?

时间:2019-06-25 01:30:54

标签: java collections

如果我们使用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吗?

1 个答案:

答案 0 :(得分:1)

如果在创建迭代器后修改了列表,则ArrayList返回的迭代器将以ConcurrentModificationException失败。因此,代码在迭代时阻止对列表的修改。根据{{​​3}}文档:

  

此类的迭代器和listIterator返回的迭代器   方法是快速失败的:如果列表在结构上有任何修改   创建迭代器之后的时间,除了通过   迭代器自己的remove或add方法,迭代器会抛出一个   ConcurrentModificationException。因此,面对并发   修改后,迭代器会快速干净地失败,而不是   在不确定的时间冒任意,不确定的行为的风险   将来。

并非所有List实现都具有此特定行为。例如,使用ArrayList并发修改时迭代不会失败。