【リーダーライターロック】

リーダーライターロック とは?

公開:
💡 読む人は一緒に、書き換える人は一人で

共有データの読み取りは複数の処理に許し、書き込みはほかの読み書きを排除して行うロック。読み取りが多い処理で役立つが、公平性や管理コストに注意が必要。

📌 このページのポイント
読者は同時に、書き手は排他的に 読み取りの時間帯 書き込みの時間帯 読者A 読める 読者B 読める 書き手:待つ 書き手:変更できる ほかの読者・書き手:待つ 同じロックの規則を、読む側も書く側も守る
読み取り中に共有データを変更しない。書き手をいつ通すかは実装や公平性設定による。
ひよこ ひよこ
普通のロックと何が違うの?
ペンギン先生 ペンギン先生
読むだけの人同士は同時に入れるところだよ。共有設定を読む処理が二つあっても、誰も書き換えないなら一緒に読める。変更するときは書き込みロックを取り、ほかの読者や書き手が入れない状態にするんだ。
ひよこ ひよこ
読み取り中に、少しだけ更新したくなったら?
ペンギン先生 ペンギン先生
読み取りロックのまま共有データを変更してはいけないよ。アクセス記録やキャッシュへの追加も書き込みになることがあるんだ。名前が「取得する処理」でも、内部で変更していないかを確認する必要があるね。
ひよこ ひよこ
読み取りの鍵を、書き込みの鍵へ交換できる?
ペンギン先生 ペンギン先生
APIによるけど、単純に取り直すと行き詰まることがあるよ。JavaのReentrantReadWriteLockは読み取りから書き込みへの昇格をサポートしない。読み取りを解放してから書き込みを取得する場合は、その間に状態が変わるので条件を再確認するんだ。
ひよこ ひよこ
読む処理が多ければ、これが一番?
ペンギン先生 ペンギン先生
管理の手間もあるので、短い処理では普通のロックのほうが速い場合もあるよ。読者を優先し続ける方式だと書き手が待たされることもある。公平性の設定、読み書きの割合、保護する処理の長さを見て選びたいね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「リーダーライターロック」って出てきたら「読み取りの同時実行と、書き込みの排他を分ける鍵」と思えればだいたいOK!

参考資料

← 用語集にもどる