Java線程安全容器
一、Java同步容器
同步容器是用來解決並發情況下的容器線程安全問題的。給多線程環境準備一個線程安全的容器對象。
線程安全的容器對象: Vector, Hashtable。線程安全容器對象,都是使用synchronized方法實現的。
concurrent包中的同步容器,大多數是使用系統底層技術實現的線程安全。類似native。Java8中使用CAS。
二、Map/Set
1,ConcurrentHashMap/ConcurrentHashSet
底層哈希實現的同步Map(Set)。效率高,線程安全。使用系統底層技術實現線程安全。量級較synchronized低。key和value不能為null。
2,ConcurrentSkipListMap/ConcurrentSkipListSet
底層跳表(SkipList)實現的同步Map(Set)。有序,效率比ConcurrentHashMap稍低。
三、List
1,CopyOnWriteArrayList
寫時復制集合。寫入效率低,讀取效率高。每次寫入數據,都會創建一個新的底層數組。
四、Queue
1,ConcurrentLinkedQueue
基礎鏈表同步隊列。
2,LinkedBlockingQueue
阻塞隊列,隊列容量不足自動阻塞,隊列容量為0自動阻塞。
3,ArrayBlockingQueue
底層數組實現的有界隊列。自動阻塞。根據調用API(add/put/offer)不同,有不同特性。
當容量不足的時候,有阻塞能力。
add方法在容量不足的時候,拋出異常。
put方法在容量不足的時候,阻塞等待。
單參數offer方法,不阻塞。容量不足的時候,返回false。當前新增數據操作放棄。
三參數offer方法(offer(value,times,timeunit)),容量不足的時候,阻塞times時長(單位為timeunit),如果在阻塞時長內,有容量空閑,新增數據返回true。如果阻塞時長範圍內,無容量空閑,放棄新增數據,返回false。
4,DelayQueue
延時隊列。根據比較機制,實現自定義處理順序的隊列。常用於定時任務。如:定時關機。
5,LinkedTransferQueue
轉移隊列,使用transfer方法,實現數據的即時處理。沒有消費者,就阻塞。
6,SynchronusQueue
同步隊列,是一個容量為0的隊列。是一個特殊的TransferQueue。
必須現有消費線程等待,才能使用的隊列。
add方法,無阻塞。若沒有消費線程阻塞等待數據,則拋出異常。
put方法,有阻塞。若沒有消費線程阻塞等待數據,則阻塞。
Java線程安全容器