目錄
- 前言
- 1.HashTable
- 2.ConcurrentHashMap
- 總結
前言
在使用多線程前,我們用HashMap類來創建哈希表,但這個類線程不安全,在這篇文章,我們將介紹多線程環境的哈希表,將會講述HashTable, HashMap, ConcurrentHashMap這三個類的主要區別。
1.HashTable
HashTable實際上就是線程安全的HashMap,兩者的功能十分相似,只是HashTable會在代碼一些關鍵地方進行加鎖,比如看其中的get方法:
HashTable雖然是線程安全的類,但已經不推薦使用了,我們目前主流使用的就是接下來要提到的ConcurrentHashMap。
2.ConcurrentHashMap
ConcurrentHashMap是針對多線程場景專門優化的一個哈希表,使用方法和普通的哈希表一樣。
ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
ConcurrentHashMap,對比于HashTable,最大的調整是針對鎖的粒度進行了優化,上面可以看到,HashTale針對this進行加鎖,如果進行操作,針對任何一個進程,都會對整個哈希表觸發鎖競爭。
而ConcurrentHashMap上,對哈希表上的每一個鏈表都提供了一個鎖。也就是說,在針對哈希表中同一個鏈表的修改才會引入阻塞。這樣的方案使競爭更小。
此外ConcurrentHashMap采取了原子類的放哪,基于CAS操作來針對size進行變更。
在ConcurrentHashMap擴容的時候,不會把所有鍵值對都搬運到更大的數組上,每次只運一部分,來確保單次搬運的速度足夠快,使鎖的持有時間足夠短,減少開銷。具體是每次進行get,put,remove等操作時,都會搬運一部分。
總結
本篇文章講述了HashTable, HashMap, ConcurrentHashMap的主要區別,其中ConcurrentHashMap的區別最多,優化最好,需要著重進行理解。