JDK 執行緒安全集合原始碼筆記

2021-10-05 19:10:40 字數 1624 閱讀 8860

當隊列為空,消費者執行緒被阻塞;當佇列裝滿,生產者執行緒被阻塞。這是阻塞佇列的基本特點。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命名空間下,增加了用於多執行緒協同的併發集合類 執行緒安全集合 執行緒安全集合 就是當多執行緒訪問時,採用了加鎖的機制 即當乙個執行緒訪問集合時,會對這個集合進行保護,其他執行...