ConcurrentLinkedQueue

成員:head tail

內部類:Node  item和next,Itr implements Iterator
add  offer   
利用UNSAFE.compareAndSwapObject(p, nextOffSet, null, newNode)(p表示遍歷整個鏈表一直到next爲null爲止的Node)
如果設置成功,調用UNSAFE.compareAndSwapObject(this, tailOffSet, cmp, newNode),如果設置失敗也沒關係,因爲說明在上一步到這一步之間有其他線程添入了新的節點並且重新設置了tail
總結:使用CAS原子指令來處理數據的併發訪問。
可以容忍不一致,也就是說元素節點(Node)的增刪和head,tail的引用可以不同步
做poll的時候,會從head開始遍歷,如果當前head指向一個值爲null的節點,繼續遍歷,直到有值的節點,然後將head引用該節點
1、這裏的null值節點都是廢棄的,在到達HOPS閥值之後就會被斷開,斷開之後自然會被垃圾回收器回收
做offer的時候,會判斷tail是否有next,如果有,開始遍歷,一直到next爲null爲止,將新的節點設置到該節點的next。然後將tail引用該節點
1、tail後面還有節點是因爲tail滯後了,但在到達HOPS閥值之後就會重新設置tail的值
在遍歷過程中,如果是遇到哨兵(next指向自己)節點,重新從head開始遍歷

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章