ConcurrentHashMap應用注意事項

1、public V get(Object key)不涉及到鎖,也就是說獲得對象時沒有使用鎖;
2、keySet().iterator()及keys(),獲取的Iterator、Enumeration變量是單線程訪問安全的,多線程訪問時要麼生成多個Iterator、Enumeration(通過調用相應的獲取方法),要麼以ConcurrentHashMap變量爲鎖進行同步(synchronized該變量);ConcurrentHashMap變量是多線程訪問安全的,儘管是多線程訪問,多數情況下應該沒有鎖爭用;
3、put、remove方法要使用鎖,但並不一定有鎖爭用,原因在於ConcurrentHashMap將緩存的變量分到多個Segment,每個Segment上有一個鎖,只要多個線程訪問的不是一個Segment就沒有鎖爭用,就沒有堵塞,各線程用各自的鎖,ConcurrentHashMap缺省情況下生成16個Segment,也就是允許16個線程併發的更新而儘量沒有鎖爭用;
4、Iterator、Enumeration獲得的對象,不一定是和其它更新線程同步,獲得的對象可能是更新前的對象,ConcurrentHashMap允許一邊更新、一邊遍歷,未遍歷到的key一般能放映value更新;
5、有些情況下這種不一致是允許的,如果需要最大的性能、吞吐量,則正好使用ConcurrentHashMap。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章