| Check the comment here on Mutex faireness: https://go-review.googlesource.com/c/go/+/34310/8/src/sync/m... > Mutex fairness. > Mutex can be in 2 modes of operations: normal and starvation. > In normal mode waiters are queued in FIFO order, but a woken up waiter > does not own the mutex and competes with new arriving goroutines over > the ownership. New arriving goroutines have an advantage -- they are > already running on CPU and there can be lots of them, so a woken up > waiter has good chances of losing. In such case it is queued at front > of the wait queue. If a waiter fails to acquire the mutex for more than 1ms, > it switches mutex to the starvation mode. > In starvation mode ownership of the mutex is directly handed off from > the unlocking goroutine to the waiter at the front of the queue. > New arriving goroutines don't try to acquire the mutex even if it appears > to be unlocked, and don't try to spin. Instead they queue themselves at > the tail of the wait queue. > If a waiter receives ownership of the mutex and sees that either > (1) it is the last waiter in the queue, or (2) it waited for less than 1 ms, > it switches mutex back to normal operation mode. > Normal mode has considerably better performance as a goroutine can acquire > a mutex several times in a row even if there are blocked waiters. > Starvation mode is important to prevent pathological cases of tail latency. |