【Java並發核心九】並發集合框架
1、List接口:ArrayList 和 Vector
ArrayList不是線程安全的,Vector是線程安全的,Vector有一個子類,可實現後進先出(LIFO)的對象堆棧(LinkedList 也是List接口的實現類)。
2、Set接口:HashSet 和 TreeSet
Set接口最常見的實現類是HashSet,HashSet默認是以無序的方式組織元素的,而LinkedHashSet可以有序組織元素;
Treeset不僅實現了Set接口,還實現了SortedSet和NavigableSet接口。
3、Queue 和 Deque 接口
接口Queue是Collection接口的子接口,支持對表頭的操作,接口Queue的非並發實現類是PriorityQueue;
接口Deque不僅支持對表頭進行操作,而且還支持對表位進行操作,故Deque全稱是“dubbo ended queue(雙端隊列)”,Deque的非並發實現類是ArrayDeque、LinkedList。
4、非阻塞隊列:
ConcurrentHashMap 多個並發線程同時使用同一個HashMap對象時,會出現“程序假死”狀態,因為HashMap是線程不安全的,不能被多個線程所操作,而HashTable雖然是線程安全的,但是在多線程iterator()循環中調用remove()時會報異常,解決辦法就是使用ConcurrentHashMap 代替。後面寫了一個test,可以參考一下。
ConcurrentSkipListMap ConcurrentHashMap不支持排序,而ConcurrentSkipListMap 是 ConcurrentHashMap 的可排序版本。
ConcurrentSkopListSet 支持排序且不允許重復的元素
ConcurrentLinkedQueue 提供並發環境的隊列操作,常用方法:poll()、element()、peek()、add()
ConcurrentLinkedDeque ConcurrentLinkedQueue 僅支持表頭操作,ConcurrentLinkedDeque 支持隊列頭和隊列尾雙向操作
CopyOnWriteArrayList ArrayList是非線程安全類,如果想在並發中實現安全,需要使用CopyOnWriteArrayList,CopyOnWriteArrayList 可以在循環中刪除元素
CopyOnWriteArraySet HashSet的線程安全實現
package com.cd.thread; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class ConcurrentClassTest { public static void main(String args[]) { // mapTest(); mapTest2(); } public static void mapTest() { // HashMap並發測試,運行此方法,程序會假死 Map map = new HashMap(); new MyThread("小A", map).start(); new MyThread("小B", map).start(); } public static void mapTest2() { // ConcurrentHashMap並發測試,運行此方法,程序正常運行 Map map = new ConcurrentHashMap(); new MyThread("小A", map).start(); new MyThread("小B", map).start(); } private static class MyThread extends Thread { private String name; private Map map; private MyThread(String name, Map map) { this.name = name; this.map = map; } public void run() { for (int i = 0; i < 50000; i++) { map.put(name + "-" + i, name + "-" + i); System.out.println(name + "-" + i); } } } }
5、阻塞隊列:
ArrayBlockingQueue 有界阻塞隊列
PriorityBlockingQueue 並發情況下的有限隊列
LinkedBlockingQueue 與 ArrayBlockingQueue 功能一致,但是 LinkedBlockingQueue 是無界的
LinkedBlockingDueue LinkedBlockingQueue 的雙向隊列版本
SynchronousQueue 異步隊列,每個插入操作必須等待另一個線程的對應移除操作,反之亦然。
DelayQueue 延時執行任務的隊列
LinkedTransferQueue 提供與 SynchronousQueue 類似的功能,但具有嗅探功能,可以嘗試性地添加一些數據
【Java並發核心九】並發集合框架