1. 程式人生 > >ConcurrentHashMap和Hashtable區別?

ConcurrentHashMap和Hashtable區別?

syn hash 並發控制 提高 紅黑二叉樹 ble 1.7 ons 輪詢

1、底層數據結構:

JDK1.7的ConcurrentHashMap底層使用分段的數據+鏈表實現,JDK1.8采用的數據結構和HashMap1.8的結構一樣。數據+鏈表/紅黑二叉樹。

Hashttable和JDK1.8之前的HashMap的底層數據結構類似都是采用數據+鏈表的形式,數組是HashMap的主體,鏈表是為了解決哈希沖突而存在的。

2、實現線程安全的方式(重要):

在JDK1.7的時候,ConcurrentHashMap(分段鎖)對整個桶數組進行了分割分段(Segment),每一把鎖只鎖容器其中的一部分數據,多線程訪問容器裏不同數據段的數據,就不會存在鎖競爭,提高並發訪問率。

在JDK1.8的時候,已經摒棄了Segment的概念,而是直接用 Node 數組+鏈表+紅黑樹的數據結構來實現,並發控制使用 synchronized 和 CAS 來操作。

Hashtable(同一把鎖),使用synchronsized來保證線程安全,效率低下。當一個線程訪問同步方法時,其他線程也訪問同步方法時,可能會進入阻塞或輪詢狀態,如使用put添加元素,另一個線程不能使用put添加元素,也不能get。

ConcurrentHashMap和Hashtable區別?