併發類容器:
- jdk5.0以後提供了多種併發類容器來替代同步類容器從而改善效能。
- 同步類容器的狀態都是序列化的。
- 他們雖然實現了執行緒安全,但是嚴重降低了併發性,在多執行緒環境時,嚴重降低了應用程式的吞吐量。
ConcurrentMap介面下有倆個重要的實現:
- ConcurrentHashMap
- ConcurrentSkipListMap(支援併發排序功能)
ConcurrentHashMap原理:
ConcurrentHashMap內部使用段(Segment)來表示這些不同的部分,每個段其實就是一個小的HashTable,它們有自己的鎖。
只要多個修改操作發生在不同的段上,它們就可以併發進行。把一個整體分成了16個段(Segment),也就是最高支援16個執行緒的併發修改操作。
這也是在多執行緒場景時減小鎖的粒度從而降低鎖競爭的一種方案。並且程式碼中大多共享變數使用volatile關鍵字宣告,目的是第一時間獲取修改的內容,效能非常好。
1 package com.bfxy.thread.cord.collection; 2 import java.util.Map; 3 import java.util.concurrent.ConcurrentHashMap; 4 5 public class UseConcurrentMap { 6 7 public static void main(String[] args) { 8 9 ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>(); 10 11 map.put("k1", "v1"); 12 map.put("k2", "v1"); 13 map.put("k1", "vv1"); //如果元素已存在 則覆蓋掉 14 map.putIfAbsent("k1", "vvv1"); //如果元素已存在 則不會put 15 16 for(Map.Entry<String, Object> me : map.entrySet()){ 17 System.err.println("key: " + me.getKey() + ", value: " + me.getValue()); 18 } 19 map.size(); 20 } 21 22 }