2012-03-03 52 views
1

假設以下並行處理在Groovy/Gpars ....GPars與Groovy,當collectParallel()需要顯式同步時?

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

如果result僅僅是一個數組列表,並且,假設沒有線程訪問或操縱processItem()result,並result需要顯式同步?我需要知道我應該做這個,而不是...

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

回答

3

我會感到驚訝,如果返回的結果是List,但如果你看看這個評論:

在迭代與集合/對象收集()使用所提供的封閉件的一個變體異步評估每個集合的元素方法。 此方法返回後,所有的封鎖已經完成,調用者可以放心的使用結果。 以保護從造成多線程訪問的競爭條件所提供的封閉使用的任何共享資源,這一點很重要。 如果任何一個集合的元素導致閉合拋出異常,異常被重新拋出。

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

看來,當一切都做,你可以安全地使用結果,而不必有它同步

+0

,我讀了太多,但希望確保,正如我所說,'result'永遠不會在我的處理功能操作,所以我覺得我好去!謝謝 – raffian 2012-03-03 02:04:31