JUC队列-LinkedBlockingDeque(三)
生活随笔
收集整理的這篇文章主要介紹了
JUC队列-LinkedBlockingDeque(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
LinkedBlockingDeque介紹
LinkedBlockingDeque是雙向鏈表實現的阻塞隊列。該阻塞隊列同時支持FIFO和FILO兩種操作方式,即可以從隊列的頭和尾同時操作(插入/刪除);
此外,LinkedBlockingDeque還是可選容量的,防止過度膨脹,默認等于Integer.MAX_VALUE。
LinkedBlockingDeque的uml圖
說明:
3.1 first是雙向鏈表的表頭。
3.2 last是雙向鏈表的表尾。
3.3 count是LinkedBlockingDeque的實際大小,即雙向鏈表中當前節點個數。
3.4 capacity是LinkedBlockingDeque的容量,它是在創建LinkedBlockingDeque時指定的。
3.5 lock是控制對LinkedBlockingDeque的互斥鎖,當多個線程競爭同時訪問LinkedBlockingDeque時,某線程獲取到了互斥鎖lock,其它線程則需要阻塞等待,直到該線程釋放lock,其它線程才有機會獲取lock從而獲取cpu執行權。
3.6 notEmpty和notFull分別是“非空條件”和“未滿條件”。通過它們能夠更加細膩進行并發控制。
LinkedBlockingDeque源碼分析
構造方法
public LinkedBlockingDeque(int capacity) {if (capacity <= 0) throw new IllegalArgumentException();this.capacity = capacity; }其他成員的初始化:
// “雙向隊列”的表頭 transient Node<E> first; // “雙向隊列”的表尾 transient Node<E> last; // 節點數量 private transient int count; // 容量 private final int capacity; // 互斥鎖 , 互斥鎖對應的“非空條件notEmpty”, 互斥鎖對應的“未滿條件notFull” final ReentrantLock lock = new ReentrantLock(); private final Condition notEmpty = lock.newCondition(); private final Condition notFull = lock.newCondition();添加方法
public void put(E e) throws InterruptedException {putLast(e);}putLast方法
public void putLast(E e) throws InterruptedException {if (e == null) throw new NullPointerException();//構造節點Node<E> node = new Node<E>(e);// 獲得鎖final ReentrantLock lock = this.lock;lock.lock();try {//如果插入失敗,則等待直至插入成功。while (!linkLast(node))notFull.await();} finally {lock.unlock();}}linkLast方法
private boolean linkLast(Node<E> node) {// 如果“雙向鏈表的節點數量” > “容量”,則返回false,表示插入失敗。if (count >= capacity)return false;// 將“node添加到鏈表末尾”,并設置node為新的尾節點Node<E> l = last;node.prev = l;last = node;if (first == null)first = node;elsel.next = node;// 將“節點數量”+1++count;// 插入節點之后,喚醒notEmpty上的等待線程。notEmpty.signal();return true; }如果要刪除元素,則調用take方法,take方法跟put方法鏡像,方法比較類似,就不展示出來啦。
LinkedBlockingDueue與LinkedBlockingQueue的區別:
LinkedBlockingDueue沒有進行讀寫鎖的分離,因此同一時間只能有一個線程對其操作,因此在高并發應用中,它的性能要遠遠低于LinkedBlockingQueue。
總結
以上是生活随笔為你收集整理的JUC队列-LinkedBlockingDeque(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUC队列-LinkedBlocking
- 下一篇: JUC队列-ConcurrentLink