同步類容器前端
同步類容器都是線程安全的後端
同步類容器包括 Vector HashTable 。
這些容器的同步方法都是使用JDK的 Collections.synchronizedCollection,synchronizedMap,synchronizedList等工廠方法去建立實現的。其底層的機制就是對於使用synchronized關鍵字對於每個公用的方法進行同步。數組
併發類容器
是專門爲併發而設計的
使用ConcurrentHashMap來替代 hashTable
使用CopyOnWriteArrayList來替代Vector
以及併發的CopyOnWriteArraySet
ConcurrentLinkedQueue 高性能的隊列
LinkedBlockingQueue 阻塞形式的隊列緩存
ConrrentHashMap安全
concurrentMap 接口有2個實現類 CorrentSkipListMap(支持排序),ConcurrentHashMap併發
底層原理 把一個總體分爲16個段 每個段就是一個hashtable 經過減少鎖的粒度倆較少鎖競爭的問題高併發
ConcurrentHashMap<String, Object> c= new ConcurrentHashMap<String, Object>();
CopyOnWrite
包含2個類CopyOnWriteArrayList CopyOnWriteArraySet 性能
CopyOnWrite是寫時複製的容器 當往容器添加元素的時候 是先copy一份 然佛操做新的數據 最後指向該數據線程
CopyOnWriteArrayList<String> cwal = new CopyOnWriteArrayList<String>(); CopyOnWriteArraySet<String> cwas = new CopyOnWriteArraySet<String>();
併發Queue
以ConcurrentLinkedQueue 爲表明的高性能的隊列
以BlockingQueue爲接口爲表明的阻塞隊列設計
ConcurrentLinkedQueue 高性能無阻塞無界隊列
是一個適用於高併發場景下的隊列 經過無鎖的方式 實現了併發狀態下的高性能
ConcurrentLinkedQueue<String> q = new ConcurrentLinkedQueue<String>(); q.offer("a");//添加 q.add("e");//添加 q.poll("a");//一處頭元素 並刪除 q.peel("a");//只移除不刪除
BlockingQueue接口
ArrayBlockingQueue 是基於數組的阻塞隊列實現 在ArrayBlockingQueue 內部 維護了一個定長數據一遍緩存隊列中的數據對象。內部沒有實現讀寫分離 也叫有界隊列
ArrayBlockingQueue<String> array = new ArrayBlockingQueue<String>(5);
LinkedBlockingQueue 是基於鏈表的阻塞隊列內部維護者一個緩衝隊列了 其內部採用了分離鎖 實現了讀寫2個鎖 讀寫分離 是無界隊列
LinkedBlockingDeque<String> dq = new LinkedBlockingDeque<String>(10); dq.addFirst("a"); System.out.println("查看頭元素:" + dq.peekFirst());
synchronousQueue 無緩衝隊列
PriorityBlockingQueue 是基於優先級的阻塞隊列 使用了公平鎖 是無界隊列
PriorityBlockingQueue<Task> q = new PriorityBlockingQueue<Task>(); //Task類 須要實現Comparable接口 而後重寫CompareTo()方法
DelayQueue 帶有延遲時間的Queue
public class Wangmin implements Delayed{ } public class WangBa implements Runnable { private DelayQueue<Wangmin> queue = new DelayQueue<Wangmin>(); }
Deque 雙端隊列
LinkedBlockingDqueue是線程安全的雙端隊列的實現。在內部維護了前端和後端節點,沒有實現讀寫分離,效率要低於其餘Blocking隊列