並發隊列
阿新 • • 發佈:2018-11-19
重要 原則 常用 限制 區別 元素節點 通過 linked 等待
Java隊列中存在有界和無界2種,區別在於有界就是有限制的,無界是無限的。
在並發中存在阻塞和非阻塞。
阻塞:生產者寫入隊列慢的時候就會進入阻塞,等待消費者消費。當一個線程試圖對一個空隊列進行出隊列操作時,它將會被阻塞,除非有另一個線程進行了入隊列操作。
第一:ConcurrentLinkedQueue
ConcurrentLinkedQueue :是一個適用於高並發場景下的隊列,通過無鎖的方式,實現 了高並發狀態下的高性能,通常ConcurrentLinkedQueue性能好於BlockingQueue.它 是一個基於鏈接節點的無界線程安全隊列。該隊列的元素遵循先進先出的原則。頭是最先 加入的,尾是最近加入的,該隊列不允許null元素
ConcurrentLinkedQueue重要方法: add 和offer() 都是加入元素的方法(在ConcurrentLinkedQueue中這倆個方法沒有任何區別), poll() 和peek() 都是取頭元素節點,區別:peek()獲取但不移除此隊列的頭;如果此隊列為空,則返回 null,poll() 獲取並移除此隊列的頭,如果此隊列為空,則返回 null。
第二:BlockingQueue
阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列。這兩個附加的操作是: 在隊列為空時,獲取元素的線程會等待隊列變為非空。 當隊列滿時,存儲元素的線程會等待隊列可用。 阻塞隊列常用於生產者和消費者的場景,生產者是往隊列裏添加元素的線程,消費者是從隊列裏拿元素的線程。阻塞隊列就是生產者存放元素的容器,而消費者也只從容器裏拿元素。阻塞隊列是線程安全的。
並發隊列