一、線程安全實現機制
- 鎖粒度與并發控制
- Hashtable?:使用全局鎖,所有操作(如、)均通過修飾方法實現同步,導致多線程并發時競爭激烈,性能低下。
- put
- get
- synchronized
- ConcurrentHashMap?:
- JDK 1.7及之前?:采用分段鎖(Segment),每個段獨立加鎖,支持多線程并發讀寫不同段的數據,提升吞吐量;
- JDK 1.8及之后?:改用桶級別鎖(CAS +),僅對發生哈希沖突的鏈表或紅黑樹節點加鎖,進一步降低鎖競爭。
- ConcurrentHashMap?:
- synchronized
二、性能表現
- 高并發場景差異
- Hashtable因全局鎖限制,多線程環境下性能急劇下降,僅適用于低并發場景;
- ConcurrentHashMap通過細粒度鎖設計,允許讀操作完全無鎖(依賴可見性),寫操作僅鎖定沖突桶,支持高并發讀寫,性能顯著優于Hashtable。
- volatile
- weibo.com/ttarticle/p/show?id=2309405162981549015367
weibo.com/ttarticle/p/show?id=2309405162981687427333
weibo.com/ttarticle/p/show?id=2309405162981817450581
weibo.com/ttarticle/p/show?id=2309405162981939085703
weibo.com/ttarticle/p/show?id=2309405162982064652586
weibo.com/ttarticle/p/show?id=2309405162982203326534
weibo.com/ttarticle/p/show?id=2309405162982329155615
weibo.com/ttarticle/p/show?id=2309405162982458917118
weibo.com/ttarticle/p/show?id=2309405162982576619666
weibo.com/ttarticle/p/show?id=2309405162982677283140
weibo.com/ttarticle/p/show?id=2309405162982794461489
weibo.com/ttarticle/p/show?id=2309405162982932873373
weibo.com/ttarticle/p/show?id=2309405162983067353384
weibo.com/ttarticle/p/show?id=2309405162983172210730
weibo.com/ttarticle/p/show?id=2309405162983302234322
weibo.com/ttarticle/p/show?id=2309405162983423869027
weibo.com/ttarticle/p/show?id=2309405162983490715829
weibo.com/ttarticle/p/show?id=2309405162983599767554
三、數據結構與擴容策略
- 底層實現
- Hashtable?:始終使用“數組+鏈表”,無紅黑樹優化,哈希沖突時鏈表可能過長,查詢效率退化至O(n);
- ConcurrentHashMap?:
- JDK 8后引入“數組+鏈表+紅黑樹”結構,當鏈表長度≥8且數組容量≥64時,鏈表轉為紅黑樹,確保極端情況下查詢效率為O(log n)。
- 擴容機制
- Hashtable?:初始容量為11,擴容公式為;
- newSize = oldSize*2 + 1
- ConcurrentHashMap?:初始容量為16(與HashMap一致),擴容閾值為容量×負載因子(默認0.75),按2的冪次擴容。
四、功能與兼容性
- Null鍵值支持
- Hashtable與ConcurrentHashMap均?不允許?null鍵或null值,強行插入會拋出;
- NullPointerException
- 非線程安全的HashMap允許單個null鍵和多個null值。
- 迭代器特性
- Hashtable使用?安全失敗(Fail-Safe)?迭代器,遍歷期間允許修改數據,但可能讀取到舊數據;
- ConcurrentHashMap迭代器設計為弱一致性(Weakly Consistent),反映創建時的數據狀態,避免并發修改異常。
五、繼承體系與設計目標
- 類繼承關系
- Hashtable繼承自類(已標記為遺留類),接口設計較為陳舊;
- Dictionary
- ConcurrentHashMap屬于包,實現接口,專為高并發場景設計。
- java.util.concurrent
- ConcurrentMap
?總結選型建議?
- 低并發或遺留系統?:可考慮Hashtable,但需注意性能瓶頸;
- 高并發場景?:優先使用ConcurrentHashMap,尤其在Java 8+環境下,其性能與擴展性更優;
- 非線程安全需求?:直接使用HashMap以最大化單線程性能。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.