2017-06-21 67 views
0

在多線程中,我想使用一個將被更新的地圖,考慮到性能,哪個地圖會更好1. HashMap 2. ConcurrentHashMap?另外,如果我使其變得不穩定,它會執行緩慢嗎?多線程:地圖性能

它將用於Java批處理約。 20萬條記錄。 目前我不在線程中共享此地圖。 會在線程之間共享地圖,從而降低性能?

+0

您應該提供更多的上下文。它實際上將用於什麼?你期望每秒鐘讀/寫多少個?這是使社區能夠爲您提供更高質量答案的信息。請記住你今後提出的問題。 – stybl

+0

感謝您的評論。它將被用於Java批處理,因爲我在問題中編輯過,我沒有數據讀/寫每秒。該批次可以使用80/100線程運行 – Anand

+0

按照@Sty的要求添加更多詳細信息(來自AWR報告)物理讀取(塊):每秒60.9物理寫入(塊):每秒1,358.1 – Anand

回答

1

HashMap在性能上會更好,因爲它不以任何方式同步。 ConcurrentHashMap增加了管理併發讀取和特別是併發寫入訪問的開銷。

這就是說,在多線程環境中,您需要負責根據需要同步對HashMap的訪問,這也會降低性能。

因此,只有在用例允許對同步邏輯進行非常具體的優化時,我纔會去尋找HashMap。否則,ConcurrentHashMap將爲您節省大量時間來完成同步。

但是,請注意,即使使用ConcurrentHashMap,您也需要仔細考慮所需的同步級別。 ConcurrentHashMap是線程安全的,但沒有完全同步。例如,如果您絕對需要將每個讀訪問與每個寫訪問同步,則您仍然需要定製邏輯,因爲對於讀操作,ConcurrentHashMap將提供上次成功完成寫操作後的狀態。也就是說,可能仍然存在正在進行的寫入操作,這將不會被讀取看到。

至於易失性,這隻能確保對特定字段的更改將在線程之間同步。由於您可能不會更改對HashMap/ConcurrentHashMap的引用,但是在實例上工作,性能開銷將可以忽略不計。