天天看點

java多線程 --ConcurrentLinkedQueue 非阻塞 線程安全隊列

 ConcurrentLinkedQueue是一個基于連結節點的無界線程安全隊列,它采用先進先出的規則對節點進行排序,當我們添加一個元素的時候,它會添加到隊列的尾部;當我們擷取一個元素時,它會傳回隊列頭部的元素。它采用了“wait-free”算法(即CAS算法)來實作。

支援阻塞的插入方法:意思是當隊列滿時,隊列會阻塞插入元素的線程,直到隊列不滿。

支援阻塞的移除方法:意思是在隊列為空時,擷取元素的線程會等待隊列變為非空。

ArrayBlockingQueue:一個由數組結構組成的有界阻塞隊列,此隊列按照先進先出(FIFO)的原則對元素進行排序,不保證線程公平的通路隊列;

LinkedBlockingQueue:一個由連結清單結構組成的有界阻塞隊列,FIFO先進先出。

PriorityBlockingQueue:一個支援優先級排序的無界阻塞隊列。

DelayQueue:是一個支援延時擷取元素的無界阻塞隊列。

SynchronousQueue:一個不存儲元素的阻塞隊列。

LinkedTransferQueue:一個由連結清單結構組成的無界阻塞隊列。

LinkedBlockingDeque:一個由連結清單結構組成的雙向阻塞隊列。

ArrayBlockingQueue 通過 ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(1000,true);保證線程公平通路隊列。

看下構造方法:

使用可重入鎖實作。

DelayQueue使用場景:

緩存系統設計;

定時任務排程;

SynchronousQueue是一個不存儲元素的阻塞隊列。每一個put操作必須等待一個take操作,否則不能繼續添加元素。

它支援公平通路隊列。預設情況下線程采用非公平性政策通路隊列。

SynchronousQueue的吞吐量高于LinkedBlockingQueue和ArrayBlockingQueue。

Fork/Join架構是Java 7提供的一個用于并行執行任務的架構,是一個把大任務分割成若幹個小任務,最終彙總每個小任務結果後得到大任務結果的架構。

java多線程 --ConcurrentLinkedQueue 非阻塞 線程安全隊列
java多線程 --ConcurrentLinkedQueue 非阻塞 線程安全隊列

優點:充分利用線程并行計算,減少線程間競争。

缺點:在某些情況下還是存在競争,比如雙端隊列裡隻有一個任務時。并且該算法會消耗了更多的系統資源,比如建立多個線程和多個雙端隊列。

架構設計:

分割任務。首先我們需要有一個fork類來把大任務分割成子任務,有可能子任務還是很大,是以還需要不停地分割,直到分割出的子任務足夠小。

執行任務并合并結果。分割的子任務分别放在雙端隊列裡,然後幾個啟動線程分别從雙端隊列裡擷取任務執行。子任務執行完的結果都統一放在一個隊列裡,啟動一個線程從隊列裡拿資料,然後合并這些資料。