併發程式設計(二)——併發類容器ConcurrentMap

Broke、薪雪發表於2018-12-26

併發類容器:

  • 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 }

 

相關文章