GPars с Groovy, когда требуется явная синхронизация с collectParallel ()? - PullRequest
1 голос
/ 03 марта 2012

Предположим следующий параллельный процесс в Groovy / Gpars ....

def result
GParsPool.withPool(5){ 
   result = idList.collectParallel{processItem(it)}
}

Если result это просто список массивов, и, предполагая, что поток не обращается или не манипулирует result в processItem(), result нужно явно синхронизировать?Мне нужно знать, должен ли я делать это вместо этого ...

def result = Collections.synchronizedList( new ArrayList())
GParsPool.withPool(5){ 
   result = idList.collectParallel{processItem(it)}
}

1 Ответ

3 голосов
/ 03 марта 2012

Я был бы удивлен, если возвращаемый результат - List, но если вы посмотрите на этот комментарий:

Итерирует по коллекции / объекту с помощью collect () метод, использующий асинхронный вариант предоставленного замыкания для оценки элемента каждой коллекции.После возврата этого метода все замыкания были завершены, и вызывающая сторона может безопасно использовать результат.Важно защитить любые общие ресурсы, используемые поставляемым замыканием, от условий гонки, вызванных многопоточным доступом.Если какой-либо из элементов коллекции приводит к тому, что замыкание вызывает исключение, то исключение вызывается повторно.

здесь: http://code.google.com/p/gparallelizer/source/browse/trunk/src/main/groovy/groovyx/gpars/Parallel.groovy?r=1138

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

...