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

 ConcurrentLinkedQueue是一個基於連接節點的無界線程安全隊列,它採用先進先出的規則對節點進行排序,當咱們添加一個元素的時候,它會添加到隊列的尾部;當咱們獲取一個元素時,它會返回隊列頭部的元素。它採用了「wait-free」算法(即CAS算法)來實現。算法

阻塞隊列BlockingQueue:

  1. 支持阻塞的插入方法:意思是當隊列滿時,隊列會阻塞插入元素的線程,直到隊列不滿。
  2. 支持阻塞的移除方法:意思是在隊列爲空時,獲取元素的線程會等待隊列變爲非空。

Java裏的阻塞隊列

  1. ArrayBlockingQueue:一個由數組結構組成的有界阻塞隊列,此隊列按照先進先出(FIFO)的原則對元素進行排序,不保證線程公平的訪問隊列;
  2. LinkedBlockingQueue:一個由鏈表結構組成的有界阻塞隊列,FIFO先進先出。
  3. PriorityBlockingQueue:一個支持優先級排序的無界阻塞隊列。
  4. DelayQueue:是一個支持延時獲取元素的無界阻塞隊列。
  5. SynchronousQueue:一個不存儲元素的阻塞隊列。
  6. LinkedTransferQueue:一個由鏈表結構組成的無界阻塞隊列。
  7. LinkedBlockingDeque:一個由鏈表結構組成的雙向阻塞隊列。

ArrayBlockingQueue 經過 ArrayBlockingQueue fairQueue = new ArrayBlockingQueue(1000,true);保證線程公平訪問隊列。數組

看下構造方法:緩存

  public ArrayBlockingQueue(int capacity, boolean fair) {
        if (capacity <= 0)
            throw new IllegalArgumentException();
        this.items = new Object[capacity];
        lock = new ReentrantLock(fair);
        notEmpty = lock.newCondition();
        notFull =  lock.newCondition();
    }

使用可重入鎖實現。安全

DelayQueue使用場景:框架

  1. 緩存系統設計;
  2. 定時任務調度;

 

SynchronousQueue是一個不存儲元素的阻塞隊列。每個put操做必須等待一個take操做,不然不能繼續添加元素。
它支持公平訪問隊列。默認狀況下線程採用非公平性策略訪問隊列。
SynchronousQueue的吞吐量高於LinkedBlockingQueue和ArrayBlockingQueue。this

Fork Join框架:

Fork/Join框架是Java 7提供的一個用於並行執行任務的框架,是一個把大任務分割成若干個小任務,最終彙總每一個小任務結果後獲得大任務結果的框架。spa

工做竊取算法:

優勢:充分利用線程並行計算,減小線程間競爭。線程

缺點:在某些狀況下仍是存在競爭,好比雙端隊列裏只有一個任務時。而且該算法會消耗了更多的系統資源,好比建立多個線程和多個雙端隊列。設計

 

框架設計:code

  1. 分割任務。首先咱們須要有一個fork類來把大任務分割成子任務,有可能子任務仍是很大,因此還須要不停地分割,直到分割出的子任務足夠小。
  2. 執行任務併合並結果。分割的子任務分別放在雙端隊列裏,而後幾個啓動線程分別從雙端隊列裏獲取任務執行。子任務執行完的結果都統一放在一個隊列裏,啓動一個線程從隊列裏拿數據,而後合併這些數據。
相關文章
相關標籤/搜索