HashMap和ConcurrentHashMap的區別,ConcurrentHashMap安全執行緒嗎,ConcurrentHashMap如何保證安全執行緒?

來源:互聯網
上載者:User

HashMap和ConcurrentHashMap的區別。

 1. HashMap是非安全執行緒的,ConurrentHashMap是安全執行緒的。

 2. ConcurrentHashMap將整個Hash桶進行了分段segment,也就是將這個大的數組分成了幾個小的片段segment,而且每個小的片段segment上面都有鎖的存在,那麼在插入元素的時候就需要先找到應該插入到哪一個片段segment,然後再在這個片段上面進行插入,而且這裡還需要擷取segment鎖。

 3.ConcurrentHashMap讓鎖的粒度更精細一些,並發效能更好。


ConcurrentHashMap安全執行緒嗎。ConcurrentHashMap如何保證安全執行緒。

 1. HashTable容器在競爭激烈的並發環境下表現出效率低下的原因是所有訪問HashTable的線程都必須競爭同一把鎖,那假如容器裡有多把鎖,每一把鎖用於鎖容器中的一部分資料,那麼當多線程訪問容器裡不同資料區段的資料時,線程間就不會存在鎖競爭,從而可以有效提高並發訪問效率,這就是ConcurrentHashMap所使用的分段鎖技術,首先將資料分成一段一段的儲存,然後給每一段資料配一把鎖,當一個線程佔用鎖訪問其中一個段資料的時候,其他段的資料也能被其他線程訪問。

 2. get操作的高效之處在於整個get過程不需要加鎖,除非讀到的值是空的才會加鎖重讀。get方法裡將要使用的共用變數都定義成volatile,如果用於統計當前segment大小的count欄位和用於儲存值的HashEntry的value。定義成volatile的變數,能夠線上程之間保持可見度,能夠被多線程同時讀,並且保證不會讀到到期的值,但是只能被單線程寫(有一種情況可以被多線程寫,就是寫入的值不依賴於原值),在get操作裡只需要讀不需要寫共用變數的count和value,所以可以不用加鎖。

 3. Put方法首先定位到segment,然後在segment裡進行插入操作。插入操作需要經曆兩個步驟,第一步判斷是否需要對segment裡的HashEntry數組進行擴容,第二部定位添加元素的位置然後放在HashEntry數組裡。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.