首先new一個新的hash表(nextTable)出來荔燎,大小是原來的2倍耻姥。后面的rehash都是針對這個新的hash表操作,不涉及原h(huán)ash表(table)有咨。
然后會對原h(huán)ash表(table)中的每個鏈表進行rehash琐簇,此時會嘗試獲取頭節(jié)點的鎖。這一步就保證了在rehash的過程中不能對這個鏈表執(zhí)行put操作。
通過sizeCtl控制婉商,使擴容過程中不會new出多個新hash表來似忧。
最后,將所有鍵值對重新rehash到新表(nextTable)中后丈秩,用nextTable將table替換盯捌。這就避免了HashMap中g(shù)et和擴容并發(fā)時,可能get到null的問題蘑秽。
在整個過程中饺著,共享變量的存儲和讀取全部通過volatile或CAS的方式,保證了線程安全肠牲。