深入分析ConcurrentHashMap

2021-07-10 03:15:27 字數 1541 閱讀 7785

再多執行緒的情況下,如果使用hashmap,就會導致死迴圈,導致cpu利用率接近100%,所以如果是併發的情況不要使用hashmap

導致死迴圈主要是這段**,當在多執行緒的情況由於沒有同步導致,著段**在擴容的時候會執行

do  while (e != null);
執行緒安全的hashtable 容器

hashtable安全是安全,但是代價太大,該容器採用synchronized來保證執行緒安全,在多執行緒同時對它進行操作,競爭激烈的情況下效率非常的底下。因為當乙個執行緒訪問的時候,其他執行緒在輪詢或阻塞的狀態。如執行緒1使用put進行新增元素,執行緒2不但不能使用put方法新增元素,並且也不能使用get方法來獲取元素,所以競爭越激烈效率越低。

併發集合容器concurrenthashmap

concurrenthashmap 裡面的table 是實現 map.entry介面的乙個陣列,在對concurrenthashmap,進行put操作的時候,如果裡面沒有

鍵值對,則進行新增。

else if ((f = tabat(tab, i = (n - 1) & hash)) == null)
這裡的castabat,以及tabat本質使用的是sun.misc.unsafe這裡類裡面的方法,該方法是在不加鎖的情況下通過cas實現執行緒安全

如果裡面有存在想通過的key,那麼就對其進行更新,在更新的**塊中,使用synchronized 來進行同步

synchronized (f) 

.....}}

....

}}

剛才我們說hashmap 在重新分配空間的時候會導致死迴圈,那麼concurrenthashmap是如何解決這個問題的了?結果跟我們上面分析的put

操作如出一轍

else if ((f = tabat(tab, i)) == null)

advance = castabat(tab, i, null, fwd);

else if ((fh = f.hash) == moved)

advance = true; // already processed

else

else if (eh < 0)

return (p = e.find(h, key)) != null ? p.val : null;

while ((e = e.next) != null)

}

get的實現相對於來說簡單了,先經過一次再雜湊,然後使用這個雜湊值通過雜湊運算定位到table,從**上面看到就是使用乙個 tabat操作而並沒有使用synchronized來對**塊進行同步,是因為在儲存

value 的時候使用了volatile

static class nodeimplements map.entry{

final int hash;

final k key;

volatile v val;

....

IsPostBack深入分析

1 ispostback 介紹 ispostback是 page類有乙個 bool型別的屬性,用來判斷針對當前 form的請求是第一次還是非第一次請求。當 ispostback true時表示非第一次請求,我們稱為 postback,當 ispostback false時表示第一次請求。在 asp....

深入分析malloc

本文大量參考了如何實現乙個malloc這篇文章。任何乙個用過或學過c的人對malloc都不會陌生。大家都知道malloc可以分配一段連續的記憶體空間,並且在不再使用時可以通過free釋放掉。但是,許多程式設計師對malloc背後的事情並不熟悉,許多人甚至把malloc當做作業系統所提供的系統呼叫或c...

深入分析ConcurrentHashMap

執行緒不安全的hashmap 因為多執行緒環境下,使用hashmap進行put操作會引起死迴圈,導致cpu利用率接近100 所以在併發情況下不能使用hashmap。效率低下的hashtable容器 hashtable容器在競爭激烈的併發環境下表現出效率低下的原因,是因為所有訪問hashtable的執...