1

假设 Groovy/Gpars 中的以下并行过程......

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

ifresult只是一个数组列表,并且假设没有线程访问或操作resultin processItem(),是否result需要显式同步?我需要知道我是否应该这样做...

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

1 回答 1

3

如果返回的结果是 a ,我会感到惊讶List,但是如果您查看此评论:

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

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

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

于 2012-03-03T01:55:55.583 回答