2012-02-01 48 views
-1

將有500多個線程同時將唯一對象始終上載到存儲桶。類,用於處理Java中的併發數據插入

在這種情況下,我應該使用哪個數據結構/類來在java中實現bucket。

FYI:

我使用的ArrayList,Vector中,ConcurrentHashMap中,ArrayBlockingQueue,它的LinkedBlockingQueue嘗試。

ArrayList失敗,因爲它不是線程安全的。 向量消耗更多時間來插入。 (因爲獲得顯示器鎖定的等待時間很長)

......最後,我使用了ArrayBlockingQueue,這在比較其他人時聽起來不錯。

如果有任何其他良好的類/數據結構存在,請告訴我這種情況。

+0

你需要一組或一個列表?也就是說,數據結構應該自動過濾出重複的元素嗎?這是數據結構的關鍵區別,對於回答您的問題很重要。 – 2012-02-01 16:32:35

+0

不會有重複的元素。具體我需要一個列表。 – krishna 2012-02-01 16:35:13

回答

2

爭用將會非常高,因此您可能希望查看可用的無鎖等待免費實現或 - 使其簡單 - 使用ConcurrentHashMap。

鎖條是這裏最關鍵的好處,所以對於讀操作你沒有鎖,對於寫操作你只鎖定現有的一個存儲桶的一個子集,並且你只對整個散列表進行鎖定以便重新散列。

你可以找到多一點的位置:

Performance ConcurrentHashmap vs HashMap

Java Hashtable many accesses problem

1

您正在採取正確的措施來衡量績效。

一般來說,LinkedBlockingQueue比並列ArrayListBlockingQueue更適合併發訪問,所以我肯定會嘗試。

+0

在我的情況下,插入只是併發的。訪問或輪詢值將由單個線程處理。 – krishna 2012-02-01 16:38:51

1

這真的取決於你想要做什麼之後添加的東西,或在添加的東西。你首先需要考慮這一點。

在可以想象的最簡單的情況下,也許你想以後沒有特定的順序迭代對象。如果是這樣的話,ConcurrentLinkedQueue可能是插入性能最好的。