高併發下的HashMap

2021-08-10 21:58:12 字數 899 閱讀 8231

1.hashmap在插入元素過多的時候需要進行resize,resize的條件是

hashmap.size   >=  capacity * loadfactor。

2.hashmap的resize包含擴容和rehash兩個步驟,rehash在併發的情況下可能會形成鍊錶環

hashmap進行儲存時,假設size超過當前最大容量*負載因子時候會發生resize。首先看一下resize原**

void resize(int newcapacity) 

entry newtable = new entry[newcapacity];

transfer(newtable);

table = newtable;

threshold = (int)(newcapacity * loadfactor);

}

而這段**中又呼叫了transfer()方法,而這種方法實現的機制就是將每乙個鍊錶轉化到新鍊錶,而且鍊錶中的位置發生反轉,而這在多執行緒情況下是非常easy造成鍊錶迴路。從而發生get()死迴圈。我們看一下他的原始碼

void transfer(entry newtable)  while (e != null);}}

}

假如有兩個執行緒p1、p2,以及鍊錶 a=》b=》null

1、p1先執行,執行完"entrynext = e.next;"**後發生堵塞,或者其它情況不再執行下去,此時e=a。next=b

2、而p2已經執行完整段**,於是當前的新鍊錶newtable[i]為b=》a=》null

3、p1又繼續執行"entrynext = e.next;"之後的**,則執行完"e=next;"後,newtable[i]為a《=》b。則造成迴路,while(e!=null)一直死迴圈

高併發下搶購

了解高併發以及怎麼處理後,測試一下專案中下單的 邏輯很簡單,goods表中stock設定為unsigned。剛開始你可能會覺得這樣會出現超單的情況,但是測試後,沒有出現超單的情況。看似沒有問題,但是看過日誌發現問題還挺多的。這之前請看下這篇文章裡面有處理高併發下單的情況。goods id num g...

高併發下的MySQL

對於遊戲來說,db存在大量的insert update 可謂玩家的很多動作都會與db溝通。本文暫時忽略os 中的 io利用率,網絡卡流量,cpu變化情況,介紹如何檢視mysql部分引數 檢視每秒事務數 show global status like com commit show global st...

高併發下的nginx優化

網際網路分布式架構設計,提高系統併發能力的方式主要有兩種 垂直擴充套件 scale up 與水平擴充套件 scale out 垂直擴充套件 提公升單機處理能力。垂直擴充套件的方式又有兩種。增強單機硬體效能 提公升單機架構效能 水平擴充套件 增加伺服器,集群。在網際網路業務發展非常迅猛的早期,如果預算...