TL;DR

読み取りは複数が同時に、書き込みは 1 つだけが保持できる mutex。読み取り用のロックと書き込み用のロックを分けて持つ。

仕組み

Go の sync.RWMutex のドキュメントによると、ロックは任意の数の読み手か、1 つの書き手が保持できる。読み取りには RLock、書き込みには Lock を使う。Lock は、すでに読み取りか書き込みでロックされていれば、ロックが空くまでブロックする。

注意点

Go の sync.RWMutex では、読み手がロックを保持している間に ゴルーチンが Lock を呼ぶと、それ以降の RLock は書き手がロックを取って解放するまでブロックする。書き手がいつかロックを取れるようにするための決まりで、そのため再帰的な読み取りロックは禁止されている。また、RLock を Lock に昇格することも、Lock を RLock に降格することもできない。

関連

出典