2010-05-20 33 views
6

我正在尋找一個好的哈希映射實現。具體而言,這對於創建大量地圖非常有用,其中大部分地圖很小。所以記憶是一個問題。它應該是線程安全的(儘管爲了獲得更好的性能,丟掉一些奇怪的東西可能會是一個妥協的妥協),並且快速獲得和放棄。而且我還喜歡用一個正義的邊界秩序的棒子上的月亮。Java:多線程映射:實現如何比較?

我知道的選項是:

  • HashMap中。糟糕的線程安全。

  • ConcurrentHashMap。我的第一選擇,但這有一個巨大的內存足跡 - 每個實例約2k。

  • Collections.sychronizedMap(HashMap)。這對我來說行得通,但我確定必須有更快的選擇。

  • Trove or Colt - 我認爲這些都不是線程安全的,但也許代碼可以適應線程安全。

其他?有什麼建議什麼時候打什麼? Java可以使用實現的任何非常好的新哈希映射算法?

在此先感謝您的意見!

+0

不要忘記歷史悠久的HashTable。已廢棄,但仍舊在舊版Java代碼中發現。 – Uri 2010-05-20 23:31:28

+1

@Uri:它是用小寫字母t表示的哈希表:)說到遺留的.. – BalusC 2010-05-20 23:49:38

+0

您還可以通過調整concurrencyLevel構造函數參數來管理一些擴展ConcurrentHashMap的佔用空間。 – Affe 2010-05-21 00:00:09

回答

0

嗯,在Apache Mahout中有一個小巧的柯爾特。它仍然不在目前的業務。用同步塊保護代碼有什麼問題?你是否期待一些惡意複雜的方案鎖定較小的粒度比putget

如果您可以編碼,請將其提供給Mahout。

+0

我想我需要同時獲取和放入,否則重新刷新可能導致get()返回垃圾。並且那個同步會在地圖上(而不是關鍵字)。它會工作,但感覺不到最佳狀態。 – 2010-05-22 14:44:48

+0

這就是我的意思,或多或少。 – bmargulies 2010-05-22 17:36:47

0

值得一看Clojure中的持久哈希映射。

這些是不變的,線程安全的數據結構,性能可與傳統的Java HashMaps相媲美。如果你想要一個可變的地圖,你顯然需要包裝它們,但這不應該很難。

http://clojure.org/data_structures

6

Collections.synchronizedMap()只是使所有Map方法​​。

ConcurrentMap真的是你想要的接口,有幾種實現方式(例如ConcurrentHashMapConcurrentSkipList)。它有幾個操作,Map對於線程安全操作並不重要。再加上它比同步的Map更精細,因爲操作只會鎖定一部分後備數據結構而不是整個事物。

3

我對以下項目沒有經驗,但是我曾與一個項目合作過,這個項目曾發佈過Javolution,用於實時和記憶敏感的任務。

我注意到在API中有FastMap聲稱是線程安全的。正如我說的,我不知道,如果這對你有什麼好處,但值得一看:

API for FastMap

Javolution Home

+0

感謝 - FastMap看起來很有趣並且高度可配置。 – 2010-05-22 14:50:04

2

非常令人驚訝的是,它有一個2k腳印!如何降低ConcurrentHashMap的併發設置(例如2-3),並優化其初始大小(=縮小)。

我不知道內存消耗來自哪裏,但也許它與維護條紋鎖有關。如果降低併發設置,它將會少一些。

如果您想要具有開箱即用的線程安全性,性能良好,ConcurrentHashMap真的很不錯。

+0

Doh!我沒有想到你可以調整ConcurrentHashMap的設置。 – 2010-05-22 14:47:45