并發編程:并發容器,我們一起了解一下!
一、BlockingQueue
在所有的并發容器中,BlockingQueue是最常見的一種。BlockingQueue是一個帶阻塞功能的隊列,當入隊列時,若隊列已滿,則阻塞調用者;當出隊列時,若隊列為空,則阻塞調用者。
在Concurrent包中,BlockingQueue是一個接口,有許多個不同的實現類,如圖所示。
1、ArrayBlockingQueue是一個用數組實現的環形隊列,在構造方法中,會要求傳入數組的容量。
2、LinkedBlockingQueue是一種基于單向鏈表的阻塞隊列。因為隊頭和隊尾是2個指針分開操作的, 所以用了2把鎖+2個條件,同時有1個AtomicInteger的原子變量記錄count數。
3、PriorityBlockingQueue 隊列通常是先進先出的,而PriorityQueue是按照元素的優先級從小到大出隊列的。正因為如此, PriorityQueue中的2個元素之間需要可以比較大小,并實現Comparable接口。
4、DelayQueue即延遲隊列,也就是一個按延遲時間從小到大出隊的PriorityQueue。所謂延遲時間, 就是“未來將要執行的時間”減去“當前時間”。為此,放入DelayQueue中的元素,必須實現Delayed接 口。
5、SynchronousQueue是一種特殊的BlockingQueue,它本身沒有容量。先調put(...),線程會阻塞; 直到另外一個線程調用了take(),兩個線程才同時解鎖,反之亦然。對于多個線程而言,例如3個線程, 調用3次put(...),3個線程都會阻塞;直到另外的線程調用3次take(),6個線程才同時解鎖,反之亦然。
二、BlockingDeque
BlockingDeque定義了一個阻塞的雙端隊列接口,如下所示。
該接口繼承了BlockingQueue接口,同時增加了對應的雙端隊列操作接口。該接口只有一個實現, 就是LinkedBlockingDeque。
三、CopyOnWrite
CopyOnWrite指在“寫”的時候,不是直接“寫”源數據,而是把數據拷貝一份進行修改,再通過悲觀鎖或者樂觀鎖的方式寫回。
那為什么不直接修改,而是要拷貝一份修改呢? 這是為了在“讀”的時候不加鎖。
1、CopyOnWriteArrayList
和ArrayList一樣,CopyOnWriteArrayList的核心數據結構也是一個數組。
2、CopyOnWriteArraySet
CopyOnWriteArraySet 就是用 Array 實現的一個 Set,保證所有元素都不重復。其內部是封裝的一 個CopyOnWriteArrayList。