2016-05-03 65 views
3

我有很多線程將類似結果的對象添加到數組中,並希望通過刪除同步來提高此區域的性能。Java中高效的多線程陣列構建

爲此,我希望每個線程都將結果發佈到ThreadLocal數組中 - 然後一旦處理完成,我可以將數組組合到下一個階段。不幸的是,爲此ThreadLocal有一個明顯的問題:我不能在最後組合集合,因爲沒有線程訪問另一個集合。

我可以通過額外添加每個ThreadLocal數組到它們創建時的ThreadLocal旁邊的列表來解決此問題,因此我將所有列表稍後提供(這將需要同步,但只需要爲每個線程發生一次),但爲了避免內存泄漏,我必須以某種方式讓所有線程在最後返回來清理它們的ThreadLocal緩存......我更願意簡單的添加結果的過程是透明的,並且不需要除了簡單地添加結果之外的任何後續工作。

是否有編程模式或現有的ThreadLocal類對象可以解決這個問題?

+1

您可以使用'ConcurrentHashMap'而不是ThreadLocal數組並將結果對象用作映射中的鍵。 –

+0

只要每個線程產生「類似結果的對象」,其中包括這些對象應該插入最終數組中的位置,例如,包括數組索引。 –

+0

提前知道結果數量嗎?導致線程被分配產生結果的任務的動力是什麼?一組數據出現在開頭?隨機事件異步到達? –

回答

1

你是對的,ThreadLocal對象被設計爲只有可訪問當前線程。如果要跨線程進行通信,則不能使用ThreadLocal,而應使用線程安全數據結構,例如ConcurrentHashMapConcurrentLinkedQueue

對於您所描述的用例來說,在您的線程之間共享ConcurrentLinkedQueue並根據需要將它們全部寫入隊列將很容易。一旦完成後(Thread.join()將等待它們完成),您可以將隊列讀入您需要的任何其他數據結構。