這裡先不提那些編譯器方面的優化。隻看一下基于無鎖環形隊列的生産者消費者模型的工作流程。上一個圖先:

當中,buffer是一個數組,用來模拟環形隊列。
slowest_reader記錄最慢的reader讀取資料的位置,主要用來防止寫者寫得太快而覆寫掉還未被讀的資料。max_read_cursor是眼下可以讀取的最遠的資料的位置。這個位置應該是>=全部讀者的位置的(初始化時為0,小于全部讀者的位置,是以初始化時讀者是不能讀取資料的)。write_cursor是目前最快的寫者的寫入的位置。
那麼假設再來一個寫者請求寫入怎麼辦?非常好辦,把write_cursor++,然後寫入到這個位置就可以。是以,disruptor是支援多個寫者同一時候寫入資料的(僅僅是公布時要有嚴格的先後順序)。reader_cursor數組用來記錄每一個讀者的位置。
那麼,如今寫者要寫入資料,該怎麼做呢?前面已經說過了,write_cursor++,然後寫入到這個位置。
例如以下圖:
上圖中,max_read_cursor也更新了,這個更新事實上是在寫者公布他的寫入後才有的。
如今。ring buffer中有資料了,讀者能夠讀取資料了(标志是讀者的cursor<=max_read_cursor)。讀的時候就是把max_read_cursor作為最大的可讀位置。
而這個最大可讀位置可能比目前的某個讀者的讀取位置大了不止一個位置。
由于有可能寫者寫得比較快,全然能夠寫入非常多個位置而讀者還在後面,那麼這樣的情況下讀者就能夠一下子取出非常多資料,而不是一個一個地去讀取。
這也是disruptor的一個特點。
這裡僅僅是講了disruptor的基本流程。一些同步的細節并沒有說。
讀者在buffer中沒有資料可讀時該怎樣等待這是一個和業務場景強相關的邏輯。能夠輪詢,也能夠睡眠,這個後面再說。