Какова цель синхронизации блока обхода, если мы используем Collections.synchrnizedList (Collection c)? - PullRequest
0 голосов
/ 25 июня 2019

Какова цель синхронизации блока обхода, если мы используем Collections.synchrnizedList (Collection c)?

Я использую метод Collections.synchronizedList () для получения синхронизированной версии arrayList, тогда почему я должен помещать обход массива в синхронизированный блок?

Итак, я прохожу учебник о том, как сделать синхронный список arraylist. Я наткнулся на следующую строку кода.

import 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 не может быть возможным, если один поток добавляет элемент, не заблокирует ли он синхронизированный массив?

1 Ответ

1 голос
/ 25 июня 2019

Итератор, возвращаемый ArrayList, потерпит неудачу с ConcurrentModificationException, если список будет изменен после создания итератора. По этой причине код запрещает внесение изменений в список во время итерации. Согласно документам ArrayList:

Итераторы, возвращаемые итераторами этого класса и listIterator методы работают быстро: если список структурно изменен время после создания итератора, любым способом, кроме как через собственные методы удаления или добавления итератора, итератор выдаст ConcurrentModificationException. Таким образом, перед лицом одновременного модификация, итератор дает сбой быстро и чисто, а не риск произвольного, недетерминированного поведения в неопределенное время в будущем.

Не все реализации List имеют такое поведение. Например, при CopyOnWriteArrayList итерация не завершается ошибкой при одновременных изменениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...