1. 程式人生 > >java 併發容器

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 方法,有阻塞。若沒有消費執行緒阻塞等待資料,則阻塞。