LongAdder原始碼學習

2021-10-09 21:31:40 字數 2824 閱讀 5364

longadder 更適合做全域性計數統計。而atomiclong適合做自增,因為他能累加並實時返回值,而longadder統計的值時近實時。

atomiclong 由於一直通過cas自旋修改值,在高併發情況下會有很多執行緒處於自旋,而longadder 利用空間換時間的方式把要增加的值先放另一邊。

@sun

.misc.contended static

final

class

cell

final

boolean

cas(

long cmp,

long val)

// unsafe mechanics

private

static

final sun.misc.unsafe unsafe;

private

static

final

long valueoffset;

static

catch

(exception e)

}}

因為由於駐留在陣列中的原子物件往往彼此相鄰,如果乙個物件出現快取行失效,將會影響另外的物件的快取重新整理。@sun.misc.contended註解 消除了偽共享,由於快取行一般是64k 這個註解通過填充物件大小來讓快取行只存在乙個cell物件。

偽共享指的是多個執行緒同時讀寫同乙個快取行的不同變數時導致的cpu快取失效。儘管這些變數之間沒有任何關係,但由於在主記憶體中鄰近,存在於同乙個快取行之中,它們的相互覆蓋會導致頻繁的快取未命中,引發效能下降

public

void

add(

long x)

}

如果cells 存在 那麼嘗試寫入陣列物件值

如果 不存在 就初始化

如果 初始化 加鎖失敗 就再次 寫base。

final

void

longaccumulate

(long x, longbinaryoperator fn,

boolean wasuncontended)

// 擴容意向 true 可能擴容,false不會擴容

boolean collide =

false

;// true if last slot nonempty

for(;;

)}finally

if(created)

break

;continue

;//如果失敗 再次迴圈 // slot is now non-empty}}

// 擴容意向改為false

// 因為 你的(a = as[(n - 1) & h]) == null 判斷為真 說明你是能寫資料進去的不需要擴容。

collide =

false;}

// 在外面cas cells陣列元素值 失敗進來的時候是false

// 會執行到h = advanceprobe(h); 重置hash

elseif(

!wasuncontended)

// cas already known to fail

wasuncontended =

true

;// continue after rehash

// 重置 hash 過後 再來cas 陣列元素一次

// !! 還有一點就是下面條件不會 break說明都會執行h = advanceprobe(h);都會來嘗試cas

else

if(a.

cas(v = a.value,

((fn == null)

? v + x :

fn.(v, x)))

)break

;// 判斷陣列是否已經不相等了。說明已經擴容了

else

if(n >= ncpu || cells != as)

collide =

false

;// at max size or stale

// 擴容意向 改為true

elseif(

!collide)

collide =

true

;// 開始擴容

else

if(cellsbusy ==0&&

cascellsbusy()

)}finally

collide =

false

;continue

;// retry with expanded table

} h =

advanceprobe

(h);

}// 初始化cells

else

if(cellsbusy ==

0&& cells == as &&

cascellsbusy()

)}finally

// 成功退出

if(init)

break;}

// 都不成功上面加鎖失敗 再次嘗試修改base

elseif(

casbase

(v = base,

((fn == null)

? v + x :

fn.(v, x)))

)break

;// fall back on using base

}}

原始碼學習 ArrayList的擴容原始碼分析

原始碼如下 下面是arraylist的擴容機制 arraylist的擴容機制提高了效能,如果每次只擴充乙個,那麼頻繁的插入會導致頻繁的拷貝,降低效能,而arraylist的擴容機制避免了這種情況。如有必要,增加此arraylist例項的容量,以確保它至少能容納元素的數量 param mincapac...

PicoContainer原始碼學習

介紹下自己,我叫stef wu,是個菜鳥,現在在easyjf團隊學習,得到了大峽等人的熱情幫助。本序列文章是以前在學習研究picocontainer時所記錄下來的,希望借本文,能和正在學習pico新手或者研究pico的高手一起交流學習。由於我水平不好,而且是真實的從頭到尾的記錄,所以其中,特別是前面...

PicoContainer原始碼學習

介紹下自己,我叫stef wu,是個菜鳥,現在在easyjf團隊學習,得到了大峽等人的熱情幫助。本序列文章是以前在學習研究picocontainer時所記錄下來的,希望借本文,能和正在學習pico新手或者研究pico的高手一起交流學習。由於我水平不好,而且是真實的從頭到尾的記錄,所以其中,特別是前面...