在項(xiàng)目中集合的使用非常頻繁,最原始的就是數(shù)組Array,集合List提供了增加和刪除的便利以及擴(kuò)展,同時(shí)為了更快的搜尋效率,我們選擇Map映射表。Map中我們用的最多的是hashMap,它提供了較好的查詢速度,時(shí)間復(fù)雜度在O(1)。這些都是常規(guī)使用的集合。但是時(shí)常會有并發(fā)的要求,對于Map類,有一個(gè)HashTable可選,這個(gè)即實(shí)現(xiàn)了鍵值對的映射功能,同時(shí)也支持并發(fā)操作。HashTable實(shí)現(xiàn)原理主要是在hashMap上加了一個(gè)鎖,操作hashtable時(shí)會對它上鎖。這樣效率就大大下降。對于低并發(fā)可能還不是很大影響,如果同時(shí)并發(fā)成百上千的訪問,那么等待代價(jià)太大。
基于以上問題,java.util.concurrent包提供了一個(gè)更好的并發(fā)映射集合類ConcurrentHashMap,從字面意思可以理解為并發(fā)的哈希映射表。那么為什么這個(gè)類的效率就逼HashTable高呢,下面來分析一下ConcurrentHashMap的結(jié)構(gòu)。

類中包含兩個(gè)重要的內(nèi)部類,一個(gè)為Segment,可以理解為一個(gè)段,每個(gè)段包含鍵值對
一個(gè)為HashEntry,儲存鍵值對實(shí)體。
實(shí)現(xiàn)原理是:每次put數(shù)據(jù)時(shí),并不會對整個(gè)類進(jìn)行加鎖。首先獲取的是鍵的哈希值,根據(jù)哈希值找到對應(yīng)Segment,然后對segment進(jìn)行加鎖。這樣當(dāng)多個(gè)線程對該集合操作是,如果不是元素不是在同一個(gè)Segment內(nèi),那么它們之間并不會阻塞,自然效率較高。Segment 實(shí)現(xiàn)類似于HashMap.
取數(shù)據(jù)則沿著存取路徑反取,先找到具體Segment,然后在Segment中根據(jù)哈希值找鍵值對。
這是對ConcurrentHashMap的初步了解,后面會對源碼分析。
新聞熱點(diǎn)
疑難解答
圖片精選