溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

線程池阻塞隊(duì)列為什么都用LinkedBlockingQueue

發(fā)布時(shí)間:2021-12-23 17:15:15 來(lái)源:億速云 閱讀:515 作者:柒染 欄目:大數(shù)據(jù)

今天就跟大家聊聊有關(guān)線程池阻塞隊(duì)列為什么都用LinkedBlockingQueue,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

不管是Executors提供的幾種線程池,還是Spring提供的線程池,你會(huì)發(fā)現(xiàn)阻塞隊(duì)列用的都是LinkedBlockingQueue,而不是用的ArrayBlockingQueue

LinkedBlockingQueue

使用單鏈表實(shí)現(xiàn),提供3種構(gòu)造函數(shù)

  1. LinkedBlockingQueue() 無(wú)參構(gòu)造函數(shù),鏈表長(zhǎng)度為Integer.MAX_VALUE

  2. LinkedBlockingQueue(int capacity) 指定capacity長(zhǎng)度

  3. LinkedBlockingQueue(Collection c) 不指定長(zhǎng)度,即默認(rèn)長(zhǎng)度為Integer.MAX_VALUE,提供初始化元素

鏈表節(jié)點(diǎn)由Node對(duì)象組成,每個(gè)Node有item變量用于存儲(chǔ)元素,next變量指向下一個(gè)節(jié)點(diǎn)

執(zhí)行put的時(shí)候,將元素放到鏈表尾部節(jié)點(diǎn);take的時(shí)候從頭部取元素

兩種操作分別有一個(gè)鎖putLock, takeLock,互不影響,可以同時(shí)進(jìn)行

/** Lock held by take, poll, etc */
private final ReentrantLock takeLock = new ReentrantLock();

/** Lock held by take, poll, etc */
private final ReentrantLock takeLock = new ReentrantLock();
ArrayBlockingQueue

使用數(shù)組實(shí)現(xiàn),3種構(gòu)造函數(shù)

  1. ArrayBlockingQueue(int capacity) 指定長(zhǎng)度

  2. ArrayBlockingQueue(int capacity, boolean fair) 指定長(zhǎng)度,及指定是否使用FIFO順序進(jìn)出隊(duì)列

  3. ArrayBlockingQueue(int capacity, boolean fair, Collection c) 指定長(zhǎng)度,進(jìn)行隊(duì)列順序,初始元素

從構(gòu)造函數(shù)看出,ArrayBlockingQueue必須指定初始化長(zhǎng)度,如果線程池使用該隊(duì)列,指定長(zhǎng)度大了浪費(fèi)內(nèi)存,長(zhǎng)度小隊(duì)列并發(fā)性不高,在數(shù)組滿的時(shí)候,put操作只能阻塞等待,或者返回false

ArrayBlockingQueue 只定義了一個(gè)Lock,put和take使用同一鎖,不能同時(shí)進(jìn)行

/** Main lock guarding all access */
    final ReentrantLock lock;
  1. LinkedBlockingQueue 無(wú)須指定長(zhǎng)度,放入和取出元素使用不同的鎖,互不影響,效率高,通用性強(qiáng)

  2. ArrayBlockingQueue 必須指定長(zhǎng)度,大了浪費(fèi)內(nèi)存,小了性能不高,使用同一把鎖,效率低

看完上述內(nèi)容,你們對(duì)線程池阻塞隊(duì)列為什么都用LinkedBlockingQueue有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI