国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

HashMap的死循環

HelKyle / 1111人閱讀

摘要:并發的為什么會引起死循環在多線程使用場景中,應該盡量避免使用線程不安全的,而使用線程安全的。那么為什么說是線程不安全的,下面舉例子說明在并發的多線程使用場景中使用可能造成死循環。注意此時兩個線程已經成功添加數據。

并發的HashMap為什么會引起死循環?

在多線程使用場景中,應該盡量避免使用線程不安全的 HashMap,而使用線程安全的 ConcurrentHashMap。那么為什么說 HashMap 是線程不安全的,下面舉例子說明在并發的多線程使用場景中使用 HashMap 可能造成死循環。代碼例子如下(便于理解,仍然使用 JDK1.7 的環境):

public class HashMapInfiniteLoop {  

    private static HashMap map = 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的數組,loadFactor=0.75,threshold=2*0.75=1,也就是說當put第二個key的時候,map就需要進行resize。

通過設置斷點讓線程1和線程2同時debug到transfer方法(3.3小節代碼塊)的首行。注意此時兩個線程已經成功添加數據。放開thread1的斷點至transfer方法的“Entry next = e.next;” 這一行;然后放開線程2的的斷點,讓線程2進行resize。結果如下圖。

注意,Thread1的 e 指向了key(3),而next指向了key(7),其在線程二rehash后,指向了線程二重組后的鏈表。

線程一被調度回來執行,先是執行 newTalbe[i] = e, 然后是e = next,導致了e指向了key(7),而下一次循環的next = e.next導致了next指向了key(3)。

e.next = newTable[i] 導致 key(3).next 指向了 key(7)。注意:此時的key(7).next 已經指向了key(3), 環形鏈表就這樣出現了。

于是,當我們用線程一調用map.get(11)時,悲劇就出現了——Infinite Loop。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74393.html

相關文章

  • 一起讀源碼之 — HashMap(jdk1.7)

    摘要:關于不安全的問題,感興趣的可以去看一下這篇文章老生常談,的死循環。 廢話不多說,直接進入主題: 首先我們從構造方法開始: public HashMap() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_LOAD_FACTOR); } public HashMap(int initialCapacity, f...

    ASCH 評論0 收藏0
  • 2016-11-17遇到的死循環

    摘要:今天在復制代碼時,遇到死循環,導致在里面執行沒有反應其中第二個循環是直接粘貼的,其中的忘記修改,正確的代碼是后續應該避免犯這個錯誤 今天在復制代碼時,遇到死循環,導致在 Console 里面執行沒有反應: var s = [] var newA = unique(a) var newB = unique(b) for (var i = 0; i < ne...

    PascalXie 評論0 收藏0
  • WordPress 使用鉤子進行主題開發時避免死循環

    摘要:開發時,我們經常會使用或等鉤子,以便在更新文章或分類時,增加一些附加數據,這些鉤子觸發的時機是發布或更新數據的時間,如果處理不好,就會出現死循環的情況,導致更新數據時出現死循環的情況。我們可以做的是在開發過程中盡量小心,避免死循環的出現。 WordPress 開發時,我們經常會使用 save_post 或 create_post_tag 等鉤子,以便在更新文章或分類時,增加一些附加數據...

    LeexMuller 評論0 收藏0

發表評論

0條評論

HelKyle

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<