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的高手一起交流學習。由於我水平不好,而且是真實的從頭到尾的記錄,所以其中,特別是前面...