原創轉載請注明出處:https://www.cnblogs.com/agilestyle/p/11395881.html
分段鎖
分段鎖其實是一種鎖的設計,並不是具體的一種鎖,對於ConcurrentHashMap而言,其並發的實現就是通過分段鎖的形式來實現高效的並發操作。
並發容器類的加鎖機制是基於粒度更小的分段鎖,分段鎖也是提升多並發程序性能的重要手段之一。
在並發程序中,串行操作是會降低可伸縮性,並且上下文切換也會減低性能。在鎖上發生競爭時將通水導致這兩種問題,使用獨占鎖時保護受限資源的時候,基本上是采用串行方式 —— 每次只能有一個線程能訪問它。所以對於可伸縮性來說最大的威脅就是獨占鎖。
一般有三種方式降低鎖的競爭程度:
1、減少鎖的持有時間
2、降低鎖的請求頻率
3、使用帶有協調機制的獨占鎖,這些機制允許更高的並發性。
在某些情況下可以將鎖分解技術進一步擴展為一組獨立對象上的鎖進行分解,這成為分段鎖。
其實說的簡單一點就是:
容器里有多把鎖,每一把鎖用於鎖容器其中一部分數據,那么當多線程訪問容器里不同數據段的數據時,線程間就不會存在鎖競爭,從而可以有效的提高並發訪問效率,這就是ConcurrentHashMap所使用的鎖分段技術,首先將數據分成一段一段的存儲,然后給每一段數據配一把鎖,當一個線程占用鎖訪問其中一個段數據的時候,其他段的數據也能被其他線程訪問。
比如:在ConcurrentHashMap中使用了一個包含16個鎖的數組,每個鎖保護所有散列桶的1/16,其中第N個散列桶由第(N mod 16)個鎖來保護。假設使用合理的散列算法使關鍵字能夠均勻的分部,那么這大約能使對鎖的請求減少到越來的1/16。也正是這項技術使得ConcurrentHashMap支持多達16個並發的寫入線程。