java 併發容器
解決併發情況下的容器執行緒安全問題的。給多執行緒環境準備一個執行緒安全的容器物件。 執行緒安全的容器物件: Vector, Hashtable。執行緒安全容器物件,都是使用 synchronized 方法實現的。 concurrent 包中的同步容器,大多數是使用系統底層技術實現的執行緒安全。類似 native。 Java8 中使用 CAS。
1. Map/Set
1.1 ConcurrentHashMap/ConcurrentHashSet
底層雜湊實現的同步 Map(Set)。效率高,執行緒安全。使用系統底層技術實現執行緒安全。 量級較 synchronized 低。key 和 value 不能為 null。
1.2 ConcurrentSkipListMap/ConcurrentSkipListSet
底層跳錶(SkipList)實現的同步 Map(Set)。有序,效率比 ConcurrentHashMap稍低。 跳錶專題
public static void main(String[] args) { //Hashtable底層採用同步方式實現 final Map<String, String> map = new Hashtable<>(); //底層雜湊實現的同步 //final Map<String, String> map = new ConcurrentHashMap<>(); //底層使用跳錶實現 // final Map<String, String> map = new ConcurrentSkipListMap<>(); final Random r = new Random(); Thread[] array = new Thread[100]; final CountDownLatch latch = new CountDownLatch(array.length); long begin = System.currentTimeMillis(); for(int i = 0; i < array.length; i++){ array[i] = new Thread(new Runnable() { @Override public void run() { for(int j = 0; j < 100000; j++){ map.put("key"+r.nextInt(1000000), "value"+r.nextInt(100000)); } latch.countDown(); } }); } for(Thread t : array){ t.start(); } try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } long end = System.currentTimeMillis(); System.out.println("執行時間為 : " + (end-begin) + "毫秒!"); }
2. List
2.1 CopyOnWriteArrayList
寫時複製集合。 寫入效率低, 讀取效率高。 每次寫入資料, 都會建立一個新的底層陣列。
3. Queue
3.1 ConcurrentLinkedQueue
基礎連結串列同步佇列。
public static void main(String[] args) { Queue<String> queue = new ConcurrentLinkedQueue<>(); for(int i = 0; i < 10; i++){ queue.offer("value" + i); } System.out.println(queue); System.out.println(queue.size()); // peek() -> 檢視queue中的首資料 System.out.println(queue.peek()); System.out.println(queue.size());//10 // poll() -> 獲取queue中的首資料 System.out.println(queue.poll()); System.out.println(queue.size());//9 }
3.2 LinkedBlockingQueue
阻塞佇列,佇列容量不足自動阻塞,佇列容量為 0 自動阻塞。 put & take - 自動阻塞。
3.3 ArrayBlockingQueue
底層陣列實現的有界佇列。自動阻塞。根據呼叫 API(add/put/offer)不同,有不同特 性。 當容量不足的時候,有阻塞能力。 add 方法在容量不足的時候,丟擲異常。 put 方法在容量不足的時候,阻塞等待。 offer 方法, 單引數 offer 方法,不阻塞。容量不足的時候,返回 false。當前新增資料操作放棄。 三引數 offer 方法(offer(value,times,timeunit)) ,容量不足的時候,阻塞 times 時長(單 位為 timeunit) ,如果在阻塞時長內,有容量空閒,新增資料返回 true。如果阻塞時長範圍 內,無容量空閒,放棄新增資料,返回 false。
3.4 DelayQueue
延時佇列。根據比較機制,實現自定義處理順序的佇列。常用於定時任務。 如:定時關機。
3.5 LinkedTransferQueue
轉移佇列,使用 transfer 方法,實現資料的即時處理。沒有消費者,就阻塞。
3.6 SynchronusQueue
同步佇列,是一個容量為 0 的佇列。是一個特殊的 TransferQueue。 必須現有消費執行緒等待,才能使用的佇列。 add 方法,無阻塞。若沒有消費執行緒阻塞等待資料,則丟擲異常。 put 方法,有阻塞。若沒有消費執行緒阻塞等待資料,則阻塞。