TL;DR
starvation の一種。reader を優先する reader-writer mutex で、reader が共有データにアクセスし続けるために、writer のアクセスが長時間ブロックされる問題である。
仕組み
reader-writer mutex では、複数の reader が同時に読み取りのロックを持てる。reader が優先される実装では、すでに reader がロックを持っている間も新しい reader がロックを取得できる。そのため reader が途切れなく来ると、ロックが空かず、writer はいつまでも書き込めない。
回避策は writer を優先することである。writer がロックを取ろうとしている間は、新しい reader に読み取りのロックを取らせずに待たせる。
例
Go の sync.RWMutex は writer を優先している。ドキュメントには次のように書かれている。
If any goroutine calls RWMutex.Lock while the lock is already held by one or more readers, concurrent calls to RWMutex.RLock will block until the writer has acquired (and released) the lock, to ensure that the lock eventually becomes available to the writer. Note that this prohibits recursive read-locking.
複数の reader がすでにロックを持っている状態で、あるゴルーチンが RWMutex.Lock を呼ぶと、その後の RWMutex.RLock の呼び出しは、writer がロックを取得して解放するまでブロックされる。これで writer は最終的にロックを取得できる。
注意点
writer を優先するこの仕組みのため、RWMutex では読み取りのロックを再帰的に取れない。