併發工具原始碼系列 Exchanger 原始碼解析

2021-10-24 18:54:47 字數 2856 閱讀 6349

exchanger

執行緒之間可以進行元素交換(了解就行了)

但是如果多個執行緒都來交換了,那乙個 node 效率太低,所以就提供了個 node 陣列叫 arena 讓執行緒們當作場地來交換。那麼現在交換的話就要在迴圈中進行了,因為槽位多了,就有很多時候沒有交換物件或者被別的執行緒搶走了。

屬性

@sun

.misc.contended static

final

class

node

// participant 的作用就是為每個執行緒保留唯一的乙個node節點,它繼承threadlocal,同時在node節點中記錄在arena中的下標index。

private

final participant participant;

// 有執行緒競爭時的交換場地

private

volatile node[

] arena;

// 沒有執行緒競爭時的交換場地

private

volatile node slot;

方法

exchange(v x)

public v exchange

(v x)

throws interruptedexception

private

final object slotexchange

(object item,

boolean timed,

long ns)

//如果失敗了,則建立arena

//bound 則是上次exchanger.bound

if(ncpu >

1&& bound ==0&&

u.compareandswapint

(this

, bound,

0, seq)

) arena =

newnode

[(full +2)

<< ashift];}

//如果arena != null,直接返回,進入arenaexchange邏輯處理

else

if(arena != null)

return null;

else}/*

* 等待 release

* 進入spin+block模式

*/int h = p.hash;

long end = timed ? system.

nanotime()

+ ns :

0l;int spins =

(ncpu >1)

? spins :1;

object v;

while

((v = p.match)

== null)

else

if(slot != p)

// 重置自旋數並重試

spins = spins;

elseif(

!t.isinterrupted()

&& arena == null &&

(!timed ||

(ns = end - system.

nanotime()

)>

0l))

else

if(u.

compareandswapobject

(this

, slot, p, null))}

u.putorderedobject

(p, match, null)

; p.item = null;

p.hash = h;

return v;

}

/**

* 比較繞,大概看看

*/private

final object arenaexchange

(object item,

boolean timed,

long ns)

else

if(i <=

(m =

(b = bound)

& mmask)

&& q == null)

else

if(spins >0)

else

if(u.

getobjectvolatile

(a, j)

!= p)

spins = spins;

// releaser hasn't set match yet

elseif(

!t.isinterrupted()

&& m ==0&&

(!timed ||

(ns = end - system.

nanotime()

)>

0l))

else

if(u.

getobjectvolatile

(a, j)

== p &&

u.compareandswapobject

(a, j, p, null))}

}else

p.item = null;

// clear offer

}else

elseif(

(c = p.collides)

< m || m == full ||

!u.compareandswapint

(this

, bound, b, b + seq +1)

)else

i = m +1;

// grow

p.index = i;}}

}

HashMap原始碼系列

為了提高自己的 水平和除錯水平 主要還是面試會問 想哭 逼著自己看了主要集合框架的原始碼 這裡主要是hashmap 當然整個過程也是辛苦的 我們都知道集合的本質是資料結構 博主為了看懂它真的是下足了功夫 我的方法是 測試特殊的例子 idea的debug很強大 可以通過它看看 是否會根據自己所想的那樣...

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

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

原始碼控制工具

cvs,svn,git git使用多個分布式儲存庫,基於改變集進行歷史跟蹤。步驟 安裝,建立git儲存庫,向庫中新增內容,操作庫中檔案,合併,其他。gnu linux環境程式設計一書 gnuplot古老但流行的視覺化程式,可與ruby,python,smalltalk繫結。pause會把程序掛起,直...