摘要:并發(fā)的為什么會引起死循環(huán)在多線程使用場景中,應(yīng)該盡量避免使用線程不安全的,而使用線程安全的。那么為什么說是線程不安全的,下面舉例子說明在并發(fā)的多線程使用場景中使用可能造成死循環(huán)。注意此時兩個線程已經(jīng)成功添加數(shù)據(jù)。
并發(fā)的HashMap為什么會引起死循環(huán)?
在多線程使用場景中,應(yīng)該盡量避免使用線程不安全的 HashMap,而使用線程安全的 ConcurrentHashMap。那么為什么說 HashMap 是線程不安全的,下面舉例子說明在并發(fā)的多線程使用場景中使用 HashMap 可能造成死循環(huán)。代碼例子如下(便于理解,仍然使用 JDK1.7 的環(huán)境):
public class HashMapInfiniteLoop { private static HashMapmap = new HashMap (2,0.75f); public static void main(String[] args) { map.put(5, "C"); new Thread("Thread1") { public void run() { map.put(7, "B"); System.out.println(map); }; }.start(); new Thread("Thread2") { public void run() { map.put(3, "A); System.out.println(map); }; }.start(); } }
其中,map初始化為一個長度為2的數(shù)組,loadFactor=0.75,threshold=2*0.75=1,也就是說當(dāng)put第二個key的時候,map就需要進(jìn)行resize。
通過設(shè)置斷點讓線程1和線程2同時debug到transfer方法(3.3小節(jié)代碼塊)的首行。注意此時兩個線程已經(jīng)成功添加數(shù)據(jù)。放開thread1的斷點至transfer方法的“Entry next = e.next;” 這一行;然后放開線程2的的斷點,讓線程2進(jìn)行resize。結(jié)果如下圖。
注意,Thread1的 e 指向了key(3),而next指向了key(7),其在線程二rehash后,指向了線程二重組后的鏈表。
線程一被調(diào)度回來執(zhí)行,先是執(zhí)行 newTalbe[i] = e, 然后是e = next,導(dǎo)致了e指向了key(7),而下一次循環(huán)的next = e.next導(dǎo)致了next指向了key(3)。
e.next = newTable[i] 導(dǎo)致 key(3).next 指向了 key(7)。注意:此時的key(7).next 已經(jīng)指向了key(3), 環(huán)形鏈表就這樣出現(xiàn)了。
于是,當(dāng)我們用線程一調(diào)用map.get(11)時,悲劇就出現(xiàn)了——Infinite Loop。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/74393.html
摘要:關(guān)于不安全的問題,感興趣的可以去看一下這篇文章老生常談,的死循環(huán)。 廢話不多說,直接進(jìn)入主題: 首先我們從構(gòu)造方法開始: public HashMap() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); } public HashMap(int initialCapacity, f...
摘要:今天在復(fù)制代碼時,遇到死循環(huán),導(dǎo)致在里面執(zhí)行沒有反應(yīng)其中第二個循環(huán)是直接粘貼的,其中的忘記修改,正確的代碼是后續(xù)應(yīng)該避免犯這個錯誤 今天在復(fù)制代碼時,遇到死循環(huán),導(dǎo)致在 Console 里面執(zhí)行沒有反應(yīng): var s = [] var newA = unique(a) var newB = unique(b) for (var i = 0; i < ne...
摘要:開發(fā)時,我們經(jīng)常會使用或等鉤子,以便在更新文章或分類時,增加一些附加數(shù)據(jù),這些鉤子觸發(fā)的時機是發(fā)布或更新數(shù)據(jù)的時間,如果處理不好,就會出現(xiàn)死循環(huán)的情況,導(dǎo)致更新數(shù)據(jù)時出現(xiàn)死循環(huán)的情況。我們可以做的是在開發(fā)過程中盡量小心,避免死循環(huán)的出現(xiàn)。 WordPress 開發(fā)時,我們經(jīng)常會使用 save_post 或 create_post_tag 等鉤子,以便在更新文章或分類時,增加一些附加數(shù)據(jù)...
閱讀 1385·2021-11-22 09:34
閱讀 2591·2021-11-12 10:36
閱讀 1124·2021-11-11 16:55
閱讀 2337·2020-06-22 14:43
閱讀 1477·2019-08-30 15:55
閱讀 1988·2019-08-30 15:53
閱讀 1774·2019-08-30 10:50
閱讀 1231·2019-08-29 12:15