Подтвердить что ты не робот

Что это значит, когда мы говорим, что ArrayList не синхронизирован?

Что это значит, когда мы говорим, что ArrayList не синхронизирован?

Означает ли это, что если мы объявим массив ArrayList в области объектов, несколько потоков, обращающихся к объектам, смогут изменить список?

4b9b3361

Ответ 1

Что означает, когда мы говорим, что ArrayList не синхронизирован?

Это означает, что доступ к экземпляру ArrayList из нескольких потоков может быть небезопасным (чтение, "может привести к неожиданному поведению" или "может не работать как рекламируемый" ).

Дальнейшее чтение:

Означает ли это, что если мы объявляем объект ArrayList в области объектов, несколько потоков, обращающихся к объектам, имеют возможность изменять список?

Даже если бы он был потокобезопасным, несколько потоков могли бы изменить список.

Разница в том, что если он не потокобезопасен и несколько потоков доступа к списку, все ставки отключены. Говоря о том, что класс не является потокобезопасным, это то же самое, что и добавление "При доступе из одного потока за раз, этот метод работает следующим образом....." перед каждым описанием метода.

Ответ 2

Синхронизированный или нет, ArrayList всегда может быть изменен несколькими потоками. Синхронизация заключается в предотвращении доступа к параллельному.

С ArrayList (или коллекциями вообще) есть две проблемы concurrency.

Сначала, существует синхронизация методов. Это означает, что все вызовы методов экземпляра ArrayList синхронизированы. Таким образом, всегда выполняется только один метод. Все остальные вызовы методов, которые происходят во время вычисления первого метода, помещаются в очередь до завершения текущего метода.

Синхронизация метода может быть обеспечена путем переноса массива ArrayList следующим образом:

List list = Collections.synchronizedList(new ArrayList());

Пример: предположим, что два потока пытаются сделать следующее в одно и то же время:

list.add(0, "test");

Если у вас есть синхронизированный список, вам гарантируется, что послесловия списка начинаются с двух "тестовых" записей. Если список не синхронизирован, вы можете получить список только с одной "тестовой" записью... или другими неожиданными результатами.

Второй, существует синхронизация экземпляра. Здесь мы не только предотвращаем одновременные вызовы методов, но мы гарантируем, что только один поток имеет доступ к объекту списка за какое-то время. Это важно, если у вас есть части логики, которые требуют, чтобы список оставался в неизмененном состоянии до тех пор, пока логика не будет выполнена. Например, перебираем списки. Вы не хотите, чтобы другие потоки добавляли элементы во время перебора списка.

Такая синхронизация выполняется путем переноса вашей части логики на синхронизированный блок:

synchronized(list) {
      for (Object o:list) {
         ...
      }
}

Ответ 3

Означает ли это, что если мы объявим массив ArrayList в области объектов, несколько потоков, обращающихся к объектам, смогут изменить список?

Да. Если одновременно работает несколько потоков, это может привести к неожиданному поведению

Ответ 4

Это означает, что экземпляры ArrayList не гарантируются как потокобезопасные. Обычно это включает как чтение, так и запись. Если вы сделаете это без внешней синхронизации, вы можете оставить объект в статических состояниях и немного усердно отладить поведение.

Ответ 5

Синхронизация означает, что каждая операция является потокобезопасной - если вы используете один и тот же список массивов из двух потоков одновременно, они не могут испортить состояние. Однако это замедляет работу.

По умолчанию ArrayList не синхронизирован, вы можете достичь этого с помощью синхронизированного ключевого слова

ArrayList al=new ArrayList();

Collections.synchronized(al);

Ответ 6

Синхронизация означает, что каждая операция является поточно-ориентированной - если вы используете один и тот же вектор из двух потоков одновременно, они не могут повредить состояние. Тем не менее, это делает его медленнее.

Если вы работаете в однопоточной среде (или список ограничен потоком и никогда не используется совместно), используйте ArrayList. Если вы работаете с несколькими потоками, которые совместно используют одну и ту же коллекцию, либо используйте Vector, либо используйте ArrayList, но синхронизируйте другим способом (например, вручную или через оболочку).