您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關線程池阻塞隊列為什么都用LinkedBlockingQueue,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
不管是Executors提供的幾種線程池,還是Spring提供的線程池,你會發現阻塞隊列用的都是LinkedBlockingQueue,而不是用的ArrayBlockingQueue
使用單鏈表實現,提供3種構造函數
LinkedBlockingQueue() 無參構造函數,鏈表長度為Integer.MAX_VALUE
LinkedBlockingQueue(int capacity) 指定capacity長度
LinkedBlockingQueue(Collection c) 不指定長度,即默認長度為Integer.MAX_VALUE,提供初始化元素
鏈表節點由Node對象組成,每個Node有item變量用于存儲元素,next變量指向下一個節點
執行put的時候,將元素放到鏈表尾部節點;take的時候從頭部取元素
兩種操作分別有一個鎖putLock, takeLock,互不影響,可以同時進行
/** Lock held by take, poll, etc */
private final ReentrantLock takeLock = new ReentrantLock();
/** Lock held by take, poll, etc */
private final ReentrantLock takeLock = new ReentrantLock();
使用數組實現,3種構造函數
ArrayBlockingQueue(int capacity) 指定長度
ArrayBlockingQueue(int capacity, boolean fair) 指定長度,及指定是否使用FIFO順序進出隊列
ArrayBlockingQueue(int capacity, boolean fair, Collection c) 指定長度,進行隊列順序,初始元素
從構造函數看出,ArrayBlockingQueue必須指定初始化長度,如果線程池使用該隊列,指定長度大了浪費內存,長度小隊列并發性不高,在數組滿的時候,put操作只能阻塞等待,或者返回false
ArrayBlockingQueue 只定義了一個Lock,put和take使用同一鎖,不能同時進行
/** Main lock guarding all access */
final ReentrantLock lock;
LinkedBlockingQueue 無須指定長度,放入和取出元素使用不同的鎖,互不影響,效率高,通用性強
ArrayBlockingQueue 必須指定長度,大了浪費內存,小了性能不高,使用同一把鎖,效率低
看完上述內容,你們對線程池阻塞隊列為什么都用LinkedBlockingQueue有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。