一愚争、集合框架源碼分析
- 集合框架 (第 01 篇) 源碼分析:Collection<E> 框架總覽
- 集合框架 (第 02 篇) 源碼分析:Map<K,V > 框架總覽
- 集合框架 (第 03 篇) 源碼分析:ArrayList<E>
- 集合框架 (第 04 篇) 源碼分析:LinkedList
- 集合框架 (第 05 篇) 源碼分析:Map<K, V>接口與其內(nèi)部接口Entry<K,V>
- 集合框架 (第 06 篇) 源碼分析:哈希沖突(哈希碰撞)與解決算法
- 集合框架 (第 07 篇) 源碼分析:jdk1.7版 HashMap
- 集合框架 (第 08 篇) 源碼分析:HashMap映皆、Hashtable、ConcurrentHashMap之間的區(qū)別
- 集合框架 (第 09 篇) 源碼分析:jdk1.7版 ConcurrentHashMap
- 集合框架 (第 10 篇) 源碼分析:二叉樹轰枝、平衡二叉樹劫扒、二叉查找樹、AVL樹狸膏、紅黑樹
- 集合框架 (第 11 篇) 源碼分析:jdk1.8版 HashMap
- 集合框架 (第 12 篇) 源碼分析:jdk1.8版 ConcurrentHashMap
- 集合框架 (第 13 篇) 源碼分析:LinkedHashMap
- 集合框架 (第 14 篇) 源碼分析:TreeMap
- 集合框架 (第 15 篇) 源碼分析:Set<E> 集合
- 集合框架 (第 16 篇) 源碼分析:BlockingQueue 接口
- 集合框架 (第 17 篇) 源碼分析:CopyOnWriteArrayList 與 CopyOnWriteArraySet
原文持續(xù)更新鏈接: https://github.com/about-cloud/JavaCore
正文
一沟饥、非線程安全的HashMap
:clapper:前面的章節(jié)已經(jīng)從源碼分析了
HashMap
的實現(xiàn),這里簡單回顧一下,如想詳細(xì)了解贤旷,請參考這里广料。
jdk1.7
的HashMap
的底層實現(xiàn)是 數(shù)組 + 單向鏈表,支持key為null
幼驶,value 為null
艾杏。- 它的初始容量是
16
,負(fù)載因子默認(rèn)值0.75
盅藻,當(dāng)實際存放元素數(shù)量大于等于 閾值购桑,(而且新元素被放入的哈希槽不為空),那么就會觸發(fā)擴(kuò)容氏淑,每次擴(kuò)容時的容量都是翻倍增長(一定是2
的次冪),所以在實例存儲元素項較多的情況下勃蜘,一定要指定初始容量,避免每次擴(kuò)容帶來性能上的影響假残。- 負(fù)載因子 取值問題也是一個重要原因缭贡,取值越大哈希沖突 的概率就越高,取值越小空間浪費(fèi)度就越高辉懒。而
0.75
是一個比較折中的選擇阳惹。- 其屬性、方法眶俩、代碼塊沒有被
synchronize
修飾莹汤,也沒有使用其他同步機(jī)制,在多線程環(huán)境下是 非線程安全的颠印。
二体啰、線程安全的Hashtable
Hashtable
是HashMap
線程安全的實現(xiàn)。它也起始于 上古時期嗽仪,可追溯到jdk1.0
荒勇。(:no_good:注意是Hashtable
而非HashTable)
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
Hashtable
擴(kuò)展至Dictionary
抽象類、實現(xiàn)至Map
接口闻坚。
-
Hashtable
線程安全的實現(xiàn)機(jī)制是 幾乎在所有的方法都加:poop:synchronized
修飾沽翔; -
HashMap
允許 key 和 value 都可以是null
值,但Hashtable
對 key 窿凤、value都不允許:sob::broken_heart:為null仅偎; -
Hashtable
初始容量是11
,默認(rèn)負(fù)載因子也是0.75
雳殊。擴(kuò)容是2倍 + 1
橘沥;
處處加鎖:lock:的Hashtable
雖然保證了同步性,但性能大大折扣夯秃,再并發(fā)的情況下有些不可取座咆。
jdk1.5
又引入了新的線程安全容器:sunny: ConcurrentHashMap
痢艺,用于替代性能差的 Hashtable
。ConcurrentHashMap
為什么能夠取代 Hashtable
呢介陶?因為它在保證性能安全的情況下堤舒、性能還比Hashtable
好。
三哺呜、線程安全的ConcurrentHashMap
面對著
Hashtable
粗暴的大鎖:lock:舌缤,ConcurrentHashMap
采用 分段鎖技術(shù),將一個大的Map分割成n個小的 段segment某残,對每段進(jìn)行加鎖国撵,降低了容器加鎖的粒子度,每段(segment)各自加鎖玻墅,互不影響介牙。分段鎖使用的鎖是ReentrantLock
可重入鎖。(:dart:分段鎖使用ReentrantLock鎖其實是無鎖的一種實現(xiàn)椭豫,可參關(guān)于 CAS和AQS的文章)
ConcurrentHashMap
也是不允許 key 、value????為null旨指;:fuelpump:其他的更多實現(xiàn)和源碼分析詳見后面的文章 赏酥。