同步類容器和併發類容器
阿新 • • 發佈:2018-12-18
ConcurrentMap介面下有兩個重要的實現:ConcurrentHashMap、ConcurrentSkipListMap。ConcurrentHashMap把整個雜湊表分成多個segment,每個segment一把鎖,主要通過鎖分段技術減小了鎖的粒度,降低了衝突,從而提高了併發性。在實際的應用中,散列表一般是讀多寫少。ConcurrentHashMap 就針對讀操作做了大量的優化,運用了很多併發技巧,如不可變物件和使用volatile保證記憶體可見性,這樣,在大多數情況下讀操作甚至無需加鎖也能獲得正確的值。ConcurrentHashMap的concurrencyLevel(預設值為16)表示併發級別,這個值用來確定Segment的個數,Segment的個數是大於等於concurrencyLevel的第一個2的n次方的數。比如,如果concurrencyLevel為12,13,14,15,16這些數,則Segment的數目為16(2的4次方)。理想情況下ConcurrentHashMap的真正的併發訪問量能夠達到concurrencyLevel,因為有concurrencyLevel個Segment,假如有concurrencyLevel個執行緒需要訪問Map,並且需要訪問的資料都恰好分別落在不同的Segment中,則這些執行緒能夠無競爭地自由訪問(因為他們不需要競爭同一把鎖),達到同時訪問的效果。這也是為什麼這個引數起名為“併發級別”的原因。該值設定過高會照成空間的浪費,設定過低會降低併發性。這種對調優的把握是要通過對底層實現的深刻理解和不斷的實踐積累才能獲取的。