ArrayBlockingQueue簡介

  1. ArrayBlockingQueue基于數(shù)組,先進(jìn)先出挡爵,從尾部插入到隊(duì)列荡含,從頭部開始返回咒唆。
  2. 線程安全的有序阻塞隊(duì)列,內(nèi)部通過“互斥鎖”保護(hù)競爭資源内颗。
  3. 指定時間的阻塞讀寫
  4. 容量可限制

定義

ArrayBlockingQueue繼承AbstractQueue钧排,實(shí)現(xiàn)了BlockingQueue敦腔,Serializable接口均澳,內(nèi)部元素使用Object[]數(shù)組保存。初始化時候需要指定容量ArrayBlockingQueue(int capacity)符衔,ArrayBlockingQueue默認(rèn)會使用非公平鎖找前。

ArrayBlockingQueue只使用一把鎖,造成在存取兩種操作時會競爭同一把鎖判族,而使得性能相對低下躺盛。

add(E)方法和offer(E)

調(diào)用父類中的add方法,查看源碼可知父類中的add方法是調(diào)用offer方法實(shí)現(xiàn),所以查看offer方法源碼形帮,如下:

public boolean offer(E e) {
    //檢查元素不為null
    checkNotNull(e);
    //加鎖槽惫,獨(dú)占鎖保護(hù)競態(tài)資源。
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        //隊(duì)列已滿辩撑,返回false
        if (count == items.length)
            return false;
        else {
            //插入元素,返回true
            insert(e);
            return true;
        }
    } finally {
        //釋放鎖
        lock.unlock();
    }
}

insert源碼如下:

private void insert(E x) {
    //將元素添加到隊(duì)列中
    items[putIndex] = x;
    //putIndex表示下一個被添加元素的索引界斜,設(shè)置下一個被添加元素的索引,若隊(duì)列滿了合冀,就設(shè)置下一個被添加元素索引為0
    putIndex = inc(putIndex);
    //隊(duì)列的元素?cái)?shù)加1
    ++count;
    //喚醒notEmpty上的等待線程,也就是取元素的線程各薇。
    notEmpty.signal();
}

take()方法

public E take() throws InterruptedException {
    //獲取獨(dú)占鎖,加鎖君躺,線程是中斷狀態(tài)的話會拋異常
    final ReentrantLock lock = this.lock;
    lock.lockInterruptibly();
    try {
        //隊(duì)列為空峭判,會一直等待
        while (count == 0)
            notEmpty.await();
        //取元素的方法
        return extract();
    } finally {
        //釋放鎖
        lock.unlock();
    }
}
private E extract() {
    final Object[] items = this.items;
    E x = this.<E>cast(items[takeIndex]);
    //取完之后,刪除元素
    items[takeIndex] = null;
    //設(shè)置下一個被取出的元素索引棕叫,若是最后一個元素林螃,下一個被取出的元素索引為0
    takeIndex = inc(takeIndex);
    //元素?cái)?shù)減1
    --count;
    //喚醒添加元素的線程
    notFull.signal();
    return x;
}

源碼分析

jdk1.7.0_71

//隊(duì)列元素
final Object[] items;
//下次被take,poll,remove的索引
int takeIndex;
//下次被put,offer,add的索引
int putIndex;
//隊(duì)列中元素的個數(shù)
int count;
//保護(hù)所有訪問的主鎖
final ReentrantLock lock;
//等待take鎖,讀線程條件
private final Condition notEmpty;
//等待put鎖,寫線程條件
private final Condition notFull;

ArrayBlockingQueue(int capacity) 給定容量和默認(rèn)的訪問規(guī)則初始化

public ArrayBlockingQueue(int capacity){}

ArrayBlockingQueue(int capacity, boolean fair)知道你跟容量和訪問規(guī)則

//fair為true,在插入和刪除時,線程的隊(duì)列訪問會阻塞,并且按照先進(jìn)先出的順序,false,訪問順序是不確定的
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();
    }

ArrayBlockingQueue(int capacity, boolean fair,Collection<? extends E> c) 指定容量,訪問規(guī)則,集合來初始化

public ArrayBlockingQueue(int capacity, boolean fair,
                              Collection<? extends E> c) {}

add(E e) 添加元素到隊(duì)列末尾,成功返回true,隊(duì)列滿了拋異常IllegalStateException

public boolean add(E e) {
        return super.add(e);
    }

offer(E e)添加元素到隊(duì)列末尾,成功返回true,隊(duì)列滿了返回false

public boolean offer(E e) {}

put(E e) 添加元素到隊(duì)列末尾,隊(duì)列滿了,等待.

public void put(E e) throws InterruptedException {}

offer(E e, long timeout, TimeUnit unit)添加元素到隊(duì)列末尾,如果隊(duì)列滿了,等待指定的時間

public boolean offer(E e, long timeout, TimeUnit unit){}

poll() 移除隊(duì)列頭

public E poll() {}

take() 移除隊(duì)列頭,隊(duì)列為空的話就等待

public E take() throws InterruptedException {}

poll(long timeout, TimeUnit unit)移除隊(duì)列頭,隊(duì)列為空,等待指定的時間

public E poll(long timeout, TimeUnit unit) throws InterruptedException {}

peek()返回隊(duì)列頭,不刪除

public E peek() {}

size()

public int size(){}

remainingCapacity() 返回?zé)o阻塞情況下隊(duì)列能接受容量的大小

public int remainingCapacity() {}

remove(Object o)從隊(duì)列中刪除元素

public boolean remove(Object o) {}

contains(Object o) 是否包含元素

public boolean contains(Object o) {}

toArray()

public Object[] toArray(){}

toArray(T[] a)

public <T> T[] toArray(T[] a) {}

toString()

public String toString(){}

clear()

public void clear(){}

drainTo(Collection<? super E> c)移除隊(duì)列中可用元素,添加到集合中

public int drainTo(Collection<? super E> c) {}

drainTo(Collection<? super E> c, int maxElements)移除隊(duì)列中給定數(shù)量的可用元素,添加到集合中

public int drainTo(Collection<? super E> c, int maxElements) {}

iterator() 返回一個迭代器

public Iterator<E> iterator() {
        return new Itr();
    }

參考

http://www.reibang.com/p/9a652250e0d1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市俺泣,隨后出現(xiàn)的幾起案子疗认,更是在濱河造成了極大的恐慌急侥,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侮邀,死亡現(xiàn)場離奇詭異坏怪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)绊茧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進(jìn)店門铝宵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人华畏,你說我怎么就攤上這事鹏秋。” “怎么了亡笑?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵侣夷,是天一觀的道長。 經(jīng)常有香客問我仑乌,道長百拓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任晰甚,我火速辦了婚禮衙传,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厕九。我一直安慰自己蓖捶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布扁远。 她就那樣靜靜地躺著俊鱼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畅买。 梳的紋絲不亂的頭發(fā)上并闲,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天,我揣著相機(jī)與錄音皮获,去河邊找鬼焙蚓。 笑死,一個胖子當(dāng)著我的面吹牛洒宝,可吹牛的內(nèi)容都是我干的购公。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼雁歌,長吁一口氣:“原來是場噩夢啊……” “哼宏浩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起靠瞎,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤比庄,失蹤者是張志新(化名)和其女友劉穎求妹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佳窑,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡制恍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了神凑。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片净神。...
    茶點(diǎn)故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溉委,靈堂內(nèi)的尸體忽然破棺而出鹃唯,到底是詐尸還是另有隱情,我是刑警寧澤瓣喊,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布坡慌,位于F島的核電站,受9級特大地震影響藻三,放射性物質(zhì)發(fā)生泄漏洪橘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一趴酣、第九天 我趴在偏房一處隱蔽的房頂上張望梨树。 院中可真熱鬧,春花似錦岖寞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至淑履,卻和暖如春隶垮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秘噪。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工狸吞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人指煎。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓蹋偏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親至壤。 傳聞我的和親對象是個殘疾皇子威始,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內(nèi)容

  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,488評論 0 3
  • 一晋渺、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對于byte類型而言...
    龍貓小爺閱讀 4,257評論 0 16
  • 產(chǎn)地:耶加雪菲 班可 福法特 生豆處理法:水洗 風(fēng)味: 清新迷人的咖啡花帶有檸檬的甜香,一入口清新的柑橘酸甜還帶著...
    12th_coffee閱讀 198評論 0 1
  • 第二場活動是在錦繡山河脓斩,那是在大學(xué)南路和南四環(huán)交叉口附近的一個樓盤木西,活動主題是“奇珍異果品鑒會”。內(nèi)容便是在選購一...
    北境之風(fēng)閱讀 157評論 0 1
  • 聽說,明天是你研究生開學(xué)的日子挪挤。 這么長的時間叼丑,你還好嗎? 一直沒有你的消息和動靜扛门,不知道你現(xiàn)在在做些什么鸠信,想念著...
    迷糊趙小妖閱讀 159評論 0 0