使用Groovy的GPars,何时需要与collectParallel()进行显式同步?

时间:2012-03-03 01:40:22

标签: multithreading collections groovy synchronization gpars

在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 个答案:

答案 0 :(得分:3)

如果返回的结果是List,我会感到惊讶,但是如果你看一下这个评论:

  

使用提供的闭包的异步变量,使用 collect()方法迭代集合/对象,以评估每个集合的元素。   返回此方法后,所有闭包都已完成,调用者可以安全地使用结果。   保护所提供的闭包使用的任何共享资源免受多线程访问引起的竞争条件的影响非常重要。   如果任何集合的元素导致闭包抛出异常,则重新抛出异常。

这里: http://code.google.com/p/gparallelizer/source/browse/trunk/src/main/groovy/groovyx/gpars/Parallel.groovy?r=1138

看来,当一切都完成后,您可以安全地使用结果,而无需使其同步。