當隊列為空,消費者執行緒被阻塞;當佇列裝滿,生產者執行緒被阻塞。這是阻塞佇列的基本特點。linkedblockingqueue
對鎖進行了優化,就是put鎖和take鎖分離。
另外,執行緒協作通知方式,不都是生產者直接喚醒全部消費者,而是生產者通知乙個消費者執行緒,消費者執行緒發現還有可取的元素,會通知其他消費者執行緒。稱為cascading notification。
下面對原始碼進行簡要分析:
// 鍊錶節點數,這裡final代表的是引用不可變,而不是值不可變
/** current number of elements */
private
final atomicinteger count =
newatomicinteger()
;/**
* head of linked list.
* invariant: head.item == null
*/transient node
head;
/** * tail of linked list.
* invariant: last.next == null
*/private
transient node
last;
// take鎖,消費者執行緒需要的鎖
/** lock held by take, poll, etc */
private
final reentrantlock takelock =
newreentrantlock()
;/** wait queue for waiting takes */
private
final condition notempty = takelock.
newcondition()
;// put鎖,生產者需要的鎖
/** lock held by put, offer, etc */
private
final reentrantlock putlock =
newreentrantlock()
;/** wait queue for waiting puts */
private
final condition notfull = putlock.
newcondition()
;
到這裡位置,阻塞佇列的狀態基本定義完了,下面看簡單的生產者執行緒的put。
*
/public
void
put(e e)
throws interruptedexception
enqueue
(node)
; c = count.
getandincrement()
;if(c +
1< capacity)
//這裡就是生產者執行緒通知其他生產者執行緒,佇列沒滿
notfull.
signal()
;}finally
if(c ==0)
// 這裡是通知消費者執行緒
signalnotempty()
;}
執行緒安全集合
1.包裝執行緒不安全集合成執行緒安全集合 使用collections方法實現,需要封裝的物件建立出來要立即封裝 封裝執行緒安全的hashmap hashmap map collections.synchronizedmap new hashmap 此外還提供了 synchronizedcollect...
12 5 執行緒的安全集合
阻塞佇列方法方法 正常動作 特殊情況下動作 add新增乙個元素 如果佇列滿,則丟擲illegalstateexception異常 element 返回隊頭元素 如果隊列為空,則丟擲nosuchelementexception異常 offer 新增乙個元素並返回true 如果佇列滿則返回false p...
C 執行緒安全集合類
本文章僅為個人理解,如有錯誤請指正。從.net 4.0框架開始,在system.collections.concurrent命名空間下,增加了用於多執行緒協同的併發集合類 執行緒安全集合 執行緒安全集合 就是當多執行緒訪問時,採用了加鎖的機制 即當乙個執行緒訪問集合時,會對這個集合進行保護,其他執行...