前言 先預先說明,我這邊jdk的代碼版本為1.8.0_11,同時,因為我直接在本地jdk源碼上進行了部分修改、調試,所以,導致大家看到的我這邊貼的代碼,和大家的不太一樣。 不過,我對源碼進行修改、重構時,會保證和原始代碼的功能、邏輯嚴格一致,更多時候,可能只是修改變量名,方便理解 ...
如何計算,一對key value應該放在哪個哈希桶 大家都知道,hashmap底層是數組 鏈表 不討論紅黑樹的情況 ,其中,這個數組,我們一般叫做哈希桶,大家如果去看jdk的源碼,會發現里面有一些變量,叫做bin,這個bin,就是桶的意思,結合語境,就是哈希桶。 這里舉個例子,假設一個hashmap的數組長度為 ,那么該hashmap就有 個哈希桶,分別為bucket bucket bucket ...
2020-06-06 23:08 0 691 推薦指數:
前言 先預先說明,我這邊jdk的代碼版本為1.8.0_11,同時,因為我直接在本地jdk源碼上進行了部分修改、調試,所以,導致大家看到的我這邊貼的代碼,和大家的不太一樣。 不過,我對源碼進行修改、重構時,會保證和原始代碼的功能、邏輯嚴格一致,更多時候,可能只是修改變量名,方便理解 ...
hashcode,有點講究 什么是好的hashcode,一般來說,一個hashcode,一般用int來表示,32位。 下面兩個hashcode,大家覺得怎么樣? 只有第32位(從右到左)不一樣,好像也沒有所謂的好壞吧? 那,我們再想想,hashcode一般怎么使用呢?在hashmap中 ...
曹工說JDK源碼(1)--ConcurrentHashMap,擴容前大家同在一個哈希桶,為啥擴容后,你去新數組的高位,我只能去低位? 曹工說JDK源碼(2)--ConcurrentHashMap的多線程擴容,說白了,就是分段取任務 曹工說JDK源碼(3)--ConcurrentHashMap ...
導致擴容的情況 在了解JDK1.8的ConcurrentHashMap擴容機制之前,要先知道ConcurrentHashMap什么情況會導致擴容。 1.put操作(插入鍵值對) put函數的操作要通過putVal操作,如果有特殊情況要擴容。 put操作代碼 ...
什么情況會觸發擴容 當往hashMap中成功插入一個key/value節點時,有可能觸發擴容動作:1、如果新增節點之后,所在鏈表的元素個數達到了閾值 8,則會調用treeifyBin方法把鏈表轉換成紅黑樹,不過在結構轉換之前,會對數組長度進行判斷,實現如下: 如果數組長度n小於閾值 ...
前面一篇已經介紹過了 HashMap 的源碼: HashMap源碼解析、jdk7和8之后的區別、相關問題分析 HashMap並不是線程安全的,他就一個普通的容器,沒有做相關的同步處理,因此線程不安全主要體現在: put、get 等等核心方法在多線程情況下,都會出現修改的覆蓋,數據不一致 ...
寫在前面的話 相關背景及資源: 曹工說Spring Boot源碼(1)-- Bean Definition到底是什么,附spring思維導圖分享 曹工說Spring Boot源碼(2)-- Bean Definition到底是什么,咱們對着接口,逐個方法講解 曹工說Spring Boot ...
ConcurrentHashMap擴容機制 ConcurrentHashMap,jdk1.8,采用多線程擴容。整個擴容過程,通過CAS設置sizeCtl、transferIndex等變量協調多個線程進行並發擴容。多線程無鎖擴容的關鍵就是通過CAS設置sizeCtl與transferIndex變量 ...