1. 程式人生 > 其它 >Java面經-併發容器

Java面經-併發容器

1、jdk提供的併發容器包括:

  1.1 ConcurrentHashMap:執行緒安全的Hashmap

  1.2 CopyOnWriteArrayList:執行緒安全的List,在讀多寫少的場合,遠遠好於Vector

  1.3 ConCurrentLinkedQueue:高效的併發佇列,使用連結串列實現,可以看做一個執行緒安全的LinkedList,這是一個非阻塞佇列。

  1.4 BlockingQueue這是一個介面,jdk內部通過連結串列、陣列等方式實現了這個介面,表示阻塞佇列,非常適用於做資料共享的通道。

  1.5 ConcurrentSkipListMap:跳錶實現,這是一個Map,使用跳錶進行快速查詢。

2、ConcurrentHashMap

在ConcurrentHashMap中,無論是讀操作還是寫操作都能保證很高的效能;在進行讀操作的時候不需要加鎖,而在寫操作時通過鎖分段技術對所操作的端加鎖不影響客戶端對其他段的訪問。

1、jdk1.7將雜湊桶切分成最小陣列Segment,笑一個小陣列有n個HashEntry組成。每一個執行緒佔用鎖訪問其中一段資料,其他段資料也能被其他執行緒訪問,實現併發。

Segment繼承了ReentrantLock,所以Segment也是一種可衝入鎖,segment預設是16,並罰賭也是16

2、JDK1.8:選擇了Hashmap相同的資料結構,Node陣列+連結串列+紅黑樹結構;在鎖的實現上拋棄了原來的Segment分段鎖,採用的是CAS+Synchronized實現的更加細粒度的鎖

將鎖的級別控制在了更細粒度的哈系統陣列元素級別,也就是說只需要鎖住連結串列的頭結點,或者紅黑樹的根節點,就不會影響其他的雜湊桶陣列的讀寫,大大提高了併發度。

3、JDK1.8使用內建鎖Synchronized替換了ReentrantLock鎖

3.1:synchronized鎖在jdk1.6開始就引入了大量的優化,並且synchronized有多重鎖,會從無鎖->偏向鎖->輕量鎖->重量級鎖一步一步的轉換

3.2:減少記憶體開銷。假設使用可重入鎖獲得同步的支援,那麼每個節點都需要繼承AQS來獲取同步支援。但並不是每個節點都需要同步支援,只有連結串列的頭結點或者紅黑樹的根節點需要同步。

4、concurrenthashmap和hashtable效率哪個更高?為什麼?

4.1 concurrenthashmap更高,因為hashtable會給整個雜湊表加一大把鎖。而concurrenthashmap的鎖粒度更低,CAS+synchronized。cas保證可見性、synchronized鎖頭結點。