爲何Disruptor不使用隊列來實現RingBuffer
隊列有兩個指針,一個指向隊頭,一個指向隊尾。若是有超過一個生產者想要往隊列裏放東西,尾指針就將成爲一個衝突點,由於有多個線程要更新它。若是有多個消費者,那麼頭指針就會產生競爭,由於元素被消費以後,須要更新指針,因此不只有讀操做還有寫操做了。因此隊列一般是單生產者單消費者。
隊列(緩衝區)的目的就是爲生產者和消費者提供一個地方存放要交互的數據,緩衝它們之間傳遞的消息。這意味着緩衝區一般是滿的(生產快於消費)或是空的(消費快於生產)。生產者和消費者協調一致的狀況很是少見。
這就是咱們所說的「分離競爭點問題」或者隊列的
「合併競爭點問題」。經過將全部的東西都賦予私有的序列號,而且只容許一個消費者寫Entry對象中的變量來消除競爭,Disruptor 惟一須要處理訪問衝突的地方,是多個生產者寫入 Ring Buffer 的場景。
Cache Line:cache line解釋起來其實很簡單,就是CPU在作緩存的時候有個最小緩存單元,在同一個單元內的數據被同時被加載到緩存中,充分利用 cache line能夠大大下降數據讀寫的延遲,錯誤利用cache line也會致使緩存不一樣替換,反覆失效。
根據CPU的緩存機制,若是你訪問一個long數組,當數組中的一個值被加載到緩存中,它會額外加載另外7個。所以你能很是快地遍歷這個數組。
總結
Disruptor 爲何這麼快?
兩個核心思想:
- 計算機計算的速度遠遠大於 IO 的速度,寧肯增長一些處理代碼加大計算壓力,也要儘量多的使用緩存而非內存。
- 鎖是阻礙併發效率的元兇,儘量的避免競爭,經過合理的分配策略+內存屏障機制,實現真正的併發處理。
Disruptor相對於傳統方式的優勢:
- 緩存行填充
更多併發編程和分佈式應用的內容歡迎關注個人博客
LOFTER移動端體驗較好,博客園PC端體驗較好。