disruptor佇列SleepingWaitStrategy與YieldingWaitStrategy處理的區別

沐風Fly發表於2020-10-26

SleepingWaitStrategy
如果沒有可用的序列號,則:
首先,自旋重試100次(此值可設定,預設200次),如果在重試過程中,存在可用的序列號,則直接返回可用的序列號。
否則,如果重試指定次數以後,還是沒有可用序列號,則繼續自旋重試,但這時每重試一次,便呼叫Thread.yield方法,放棄CPU的使用權,讓其它執行緒可以使用CPU。當該執行緒再次獲取CPU使用權時,繼續重試,如果還沒有可用的序列號,則繼續放棄CPU使用權等待。此迴圈最多100次。
最後,如果還沒有可用的序列號,則呼叫LockSupport.parkNanos方法阻塞執行緒,直到存在可用的序列號。當LockSupport.parkNanos方法由於超時返回後,如果還沒有可用的序列號,則該執行緒獲取CPU使用權以後,可能繼續呼叫LockSupport.parkNanos方法阻塞執行緒。



YieldingWaitStrategy
如果沒有可用的序列號,則
首先,自旋重試100次(此值可設定,預設100次),如果在重試過程中,存在可用的序列號,則直接返回可用的序列號。
否則,如果重試指定次數以後,還是沒有可用序列號,則呼叫Thread.yield方法,放棄CPU的使用權,讓其它執行緒可以使用CPU。當該執行緒再次獲取CPU使用權時,繼續重試,如果還沒有可用的序列號,則繼續放棄CPU使用權等待。

相關文章