SynchronousQueue原始碼閱讀心得

2021-10-17 14:43:34 字數 1926 閱讀 1572

synchronousqueue(簡寫為sq)

同步佇列中,讀執行緒與寫執行緒只有相互匹配時才能完成一次完整的讀寫操作。而讀與寫的匹配依賴於transferqueue或transferstack中的transfer()

sq中重要的資料結構有transferqueue和transferstack,還有qnode。qnode裡有isdata,item,next等成員變數

全流程概要:以put(obj e)為例,我們放入e之後,transfer()首先根據e是否為空來判斷e與transferqueue中的qnode是否目的一致(目的指寫或者讀)。假設目的一致,就需要將以new qnode(e)加入到佇列,否則就poll出對應的qnode來完成寫讀一致性操作。

transferqueue中transfer(obj e)解析

主題是乙個for(;;)迴圈,根據queue中qnode的目的是否和當前操作一致來確定進入哪乙個分支。

如果一致或隊列為空的話

隨後會將新構建的qnode s插入到tail後,然後呼叫advancetail()來更新tail節點。

advancetail(t, nt)函式將nt置為tail。但與之功能類似的advancehead()會多一步操作,即在cas之後給old head加上h.next=h,從而避免garbage retention。

更新完後,會呼叫awaitfulfill()函式等待佇列中qnode被match到。這裡也是乙個基於自旋鎖類似的設定。

awaitfullfill()函式首先會設定乙個spins變數,可以理解為自旋次數,不過次數的設定條件不是很了解。然後就是乙個經典的for(;;)迴圈(在併發場景中這種格式的迴圈頻頻出現),在迴圈體內,首先就是乙個判斷current thread是否被interrupt的if,如果if成立,就會呼叫trycancle函式來將qnode s取消。

trycancel()解析

本方法多用於awaitfullfill()中(基於unsafe.compareandswapobject())

如果乙個qnode被trycancel了,那麼its item will ref itself.

上述if不成立的話,會判斷s.item與tranfer的目標物件e是否相同,如果不同就會返回s.item。這裡就會引出transfer()(line 696)函式中的乙個if邏輯。然後會根據spins是否大於0,來continue for-loop,如果不成立就會park住當前的thread。(這裡其實有乙個鎖公升級的場景)

if(x==s)(line 696)這個條件是**於如果s被cancle了,那麼s.item就等於s,而返回值x等於s.item,所以x=s

如果4中if邏輯成立,那麼會對queue進行clean,即clean掉qnode s。假設不成立,會判斷s是否offlist,如果沒有的話,就說明s沒有unlink掉,那麼我們需要將其unlink掉。

offlist()是判斷當前qnode的next是否指向它本身,如果指向它本身的話,說明被advancehead了。

最後返回item

如果目的不一致在過濾掉不一致的場景後,我們直接將head qnode(實際上是head.next,但為了方便理解,這裡統一使用head qnode)給advancehead掉,然後unpark head qnode對應的執行緒,並返回item值。

這裡值得熟記的一點就是line 714對應的if邏輯,這裡主要判斷了目標是否被完成,head qnode有沒有被cancle,以及有沒有成功cas headnode(cas(head, head.next))。

Memcache原始碼閱讀(1) 看原始碼的心得

我這是第一次看原始碼。說不上什麼心得,不過也總結一下 我覺得閱讀乙個專案的原始碼,應該是先知道這個專案具體怎麼用之後,先估計一下作者的實現,然後再看原始碼來驗證自己的想法。我這次閱讀原始碼是在沒有用過這個專案的前提下閱讀的,一開始的時候不知道從何讀起,於是就去網上找別人的部落格,跟著別人的博文一篇一...

《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具

檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...

基於Android的Gson原始碼閱讀心得

compile com.google.code.gson gson 2.7 3 建立子執行緒 讀取json檔案,並採用gson庫中的介面,對其進行解析 4 在ui 主線程中採用handle獲取解析的資料進行展示 5 原始碼說明 使用接觸最多的就是gson和gsonbuilder類。其中,gsonbu...