ConcurrentHashMap和Hashtable的區別
ConcurrentHashMap和Hashtable的區別主要體現在實現線程安全的方式上不同。
哈希數據和JDK1.8之前的HashMap。的大部分數據結構類似都是採用副本+鍊錶的形式,排列為HashMap的主體,鍊錶則是主要為了解決哈希衝突而存在的;
實現線程安全的方式(重要):①在JDK1.7的時候,ConcurrentHashMap(分段鎖)對整個桶分段進行了分割分段(Segment),每個把鎖只鎖容器其中一部分數據,多線程訪問到了JDK1.8的時候已經替換棄了Segment的概念,直接用節點上的數據鏈+鍊錶+紅黑樹的數據結構來實現。容器裡不同數據段的數據,就不會存在鎖競爭,提高並發訪問率。 (JDK1.6之後對ynchronized鎖做了很多優化)整個看起來就像是優化過且線程安全的HashMap,雖然在JDK1.8中還能看到Segment的數據。結構,但是已經簡化了屬性,只是為了兼容舊版本;②Hashtable(同一把鎖):使用同步來保證線程安全,效率非常低下。當一個線程訪問同步方法時,其他線程也訪問同步方法,可能會進入雙向或偏置狀態,如使用put添加元素,另一個線程不能使用put添加元素,也不能使用get,競爭會越來越激烈效率越低。
哈希數據和JDK1.8之前的HashMap。的大部分數據結構類似都是採用副本+鍊錶的形式,排列為HashMap的主體,鍊錶則是主要為了解決哈希衝突而存在的;
實現線程安全的方式(重要):①在JDK1.7的時候,ConcurrentHashMap(分段鎖)對整個桶分段進行了分割分段(Segment),每個把鎖只鎖容器其中一部分數據,多線程訪問到了JDK1.8的時候已經替換棄了Segment的概念,直接用節點上的數據鏈+鍊錶+紅黑樹的數據結構來實現。容器裡不同數據段的數據,就不會存在鎖競爭,提高並發訪問率。 (JDK1.6之後對ynchronized鎖做了很多優化)整個看起來就像是優化過且線程安全的HashMap,雖然在JDK1.8中還能看到Segment的數據。結構,但是已經簡化了屬性,只是為了兼容舊版本;②Hashtable(同一把鎖):使用同步來保證線程安全,效率非常低下。當一個線程訪問同步方法時,其他線程也訪問同步方法,可能會進入雙向或偏置狀態,如使用put添加元素,另一個線程不能使用put添加元素,也不能使用get,競爭會越來越激烈效率越低。
两者的对比图:
HashTable:
JDK1.7的ConcurrentHashMap:
JDK1.8的ConcurrentHashMap(TreeBin: 红黑二叉树节点 Node: 链表节点):
留言
張貼留言