Код, который вы опубликовали, безопасен - не будет ошибок из-за несогласованного состояния вашего списка массивов, поскольку доступ к нему синхронизирован.
Однако параллельные коллекции обрабатывают элементы одновременно (в то же времявремя) И не в порядке.Превышение порядка означает, что элемент 54. может быть обработан до элемента 2. Ваш список синхронизированных массивов будет содержать элементы в неопределяемом порядке.
В общем случае лучше использовать map
,filter
и другие функциональные комбинаторы для преобразования коллекции в другую коллекцию - это обеспечит сохранение гарантий упорядочения, если в коллекции есть некоторые (как, например, Seq
s).Например:
ParArray(1, 2, 3, 4).map(_ + 1)
всегда возвращает ParArray(2, 3, 4, 5)
.
Однако, если вам нужен конкретный поточно-безопасный тип коллекции, такой как ConcurrentSkipListMap
или синхронизированная коллекция, для передачи внекоторый метод в некотором API, модификация его из параллельного foreach безопасна.
Наконец, параллельный сбор примечаний обеспечивает параллельные массовые операции с данными.Изменяемые параллельные коллекции не являются поточно-ориентированными в том смысле, что вы можете добавлять к ним элементы из разных потоков.Изменяемые операции, такие как вставка на карту или добавление буфера, все еще должны быть синхронизированы.