前言
LinkedBlockingDeque是基于雙向鏈表的雙端有界阻塞隊列,使用非公平ReentrantLock實現(xiàn)線程安全,默認和最大長度都為Integer.MAX_VALUE;不允許null元素添加;實現(xiàn)骨架和ConcurrentLinkedDeque一樣,只是對并發(fā)控制的細節(jié)不同(volatile+循環(huán)CAS),雙端隊列可以用來實現(xiàn) "竊取算法" ,兩頭都可以操作隊列,相對于單端隊列可以減少一半的競爭。
定義
實現(xiàn)了BlockingDeque接口
重要字段
雙向鏈表節(jié)點
first和last節(jié)點在初始化時同時為null。
first和last節(jié)點狀態(tài)相對于ConcurrentLinkedDeque的比較簡單,因為此first和last節(jié)點都為普通變量,并不會因為頻繁的讀寫(相對于volatile變量)造成性能瓶頸。
count:元素數(shù)量計數(shù)
capacity:隊列最大容量
一個ReentrantLock鎖,兩個Condition。
構(gòu)造器
無參構(gòu)造器,默認容量Integer.MAX_VALUE
指定大于0的容量
集合構(gòu)造器,默認容量Integer.MAX_VALUE,加鎖,保證普通變量刷新到主內(nèi)存中,保證其線程可見性。
offerFirst方法(不響應(yīng)中斷)
offerLast方法(不響應(yīng)中斷)
putFirst方法(響應(yīng)中斷)
如果已經(jīng)滿了,則等待直到隊列不滿
putLast(響應(yīng)中斷)
offerFirst (響應(yīng)中斷超時)
offerLast(響應(yīng)中斷超時)
pollFirst(不響應(yīng)中斷)
pollLast(不響應(yīng)中斷)
remove方法
兩個方法分別遍歷隊列頭尾遍歷數(shù)組,時間復(fù)雜度為O(n)
contains方法
兩個方法分別遍歷隊列頭尾遍歷數(shù)組,時間復(fù)雜度為O(n)
size方法
時間復(fù)雜度為O(1)
iterator迭代器
迭代器都是弱一致性的,在操作隊列元素時需要加鎖,但是在迭代操作之間,隊列有可能被其他線程修改,當(dāng)hasNext返回true,但是下一次next和remove方法元素已經(jīng)被刪除了,此時將拋出NoSuchElementException異常。
方法列表

總結(jié)
LinkedBlockingDeque性能基本和LinkedBlockingQueue一致,只是雙端隊列和單端隊列的區(qū)別,一把鎖和兩把鎖的區(qū)別。




























