日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JUC队列-LinkedBlockingDeque(三)

發布時間:2024/2/28 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JUC队列-LinkedBlockingDeque(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LinkedBlockingDeque介紹

LinkedBlockingDeque是雙向鏈表實現的阻塞隊列。該阻塞隊列同時支持FIFO和FILO兩種操作方式,即可以從隊列的頭和尾同時操作(插入/刪除);

此外,LinkedBlockingDeque還是可選容量的,防止過度膨脹,默認等于Integer.MAX_VALUE。

LinkedBlockingDeque的uml圖

說明:

  • LinkedBlockingDeque繼承于AbstractQueue,它本質上是一個支持FIFO和FILO的雙向的隊列。
  • LinkedBlockingDeque實現了BlockingDeque接口,它支持多線程并發。當多線程競爭同一個資源時,某線程獲取到該資源之后,其它線程需要阻塞等待。
  • LinkedBlockingDeque是通過雙向鏈表實現的。
    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(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。