【モニタ】

モニタ(同期機構) とは?

最終更新:
💡 同じ鍵で共有データを守り、条件が整うまで待つ

共有データへの排他制御と、必要な状態になるまで待つ条件同期を組み合わせる並行プログラミングの仕組み。同じモニタを使う処理を保護し、待機中はロックを放して別のスレッドが状態を変えられるようにする。

📌 このページのポイント
モニタ:排他制御と条件待ち Javaのwait / notifyの動きを例に 入口で待つ 共有データ ロック保持は 同時に1スレッド 取得 条件を待つ waitでロック解放 条件が未成立 通知などで 待ちから復帰 ロックを取り直し、条件を再確認 notifyは即時の再開を保証しない 同じロックで保護する処理が対象
入口の待ちと条件待ちを分けた模式図です。条件待ちから復帰しても、ロックの再取得と条件の再確認が必要です。
ひよこ ひよこ
モニタって、画面のモニターとは違うの?
ペンギン先生 ペンギン先生
ここではスレッド同士の待ち合わせの仕組みだよ。同じモニタのロックを取って共有データを操作し、必要な条件が整うまで待つ機能も組み合わせるんだ。
ひよこ ひよこ
ミューテックスとどう違うの?
ペンギン先生 ペンギン先生
排他制御の鍵だけでなく、条件を待つ仕組みも組み合わせて考えるよ。例えば、共有バッファが空なら消費者はデータが入るのを待つ。その間に生産者がバッファへ書き込めるようにするんだ。
ひよこ ひよこ
待っている人が鍵を持ったままだと、書き込めないよね?
ペンギン先生 ペンギン先生
JavaのwaitやPythonのCondition.waitは、対応するロックを放して待つよ。再開するときはそのロックを取り直す。単に処理を休ませるsleepとは、この動作が違うんだ。
ひよこ ひよこ
Javaのsynchronizedだけで、共有データは全部安全になる?
ペンギン先生 ペンギン先生
同じオブジェクトのモニタを使う処理を排他制御するんだよ。別のロックを使ったり、保護せずに共有データへ触れたりする処理まで自動で守るわけではない。条件待ちにはwaitやnotifyなどを使うよ。
ひよこ ひよこ
notifyで起こせば、すぐ続きが動く?
ペンギン先生 ペンギン先生
notifyを呼ぶ側がロックを持つ間は、待っていた側は取り直せないよ。取り直せても、その時点で望む状態かは別。Javaのwaitではnotifyなしに復帰することもあるので、whileなどで条件を再確認するんだ。PythonのConditionも再確認が必要だよ。
もっと詳しく知りたい人へ

モニタを使えば、デッドロックも防げる?

Javaのモニタはデッドロックを自動で防ぎません。複数のロックを取る順番や、条件待ちの設計を確認する必要があります。ここで扱うJavaのオブジェクトのモニタを、離れたマシン間の待ち合わせへそのまま使えるわけでもありません。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「モニタ」って出てきたら「排他制御と条件待ちを組み合わせる仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Monitor」 = 監視・管理するもの
💬 ここでは共有状態へのアクセスと待ち合わせを管理するスレッド間の待ち合わせの概念だよ。画面表示装置を指すモニターとは文脈が違うんだ

参考資料

← 用語集にもどる