Monitor (návrhový vzor)
Monitor je návrhový vzor pro situaci, kdy více různých vláken (klientů) využívá souběžně metody jednoho objektu, přičemž tyto metody mění stav daného objektu. Je tedy třeba zajistit, aby v jednu chvíli objekt využívalo maximálně jedno vlákno a vnitřní stav objektu tak zůstával konzistentní a zároveň aby, pokud se jedno vlákno využívající objekt zablokuje (např. při čekání na jiný zdroj), bylo možné objekt uvolnit pro ostatní vlákna (klienty) a vrátit se k vykonávání metody původním vláknem, až když je to možné.
Pro tuto situaci by mohl být použit i návrhový vzor Active Object. Ten však zahrnuje další funkcionalitu navíc (jako např. řazení spouštění metod), která nemusí být vždy využita (a zbytečně by tak zvyšovala komplikovanost návrhu i implementace). Na rozdíl od Active Objectu jsou také metody monitoru vykonávány přímo v rámci klientského vlákna.
Základní princip fungování Monitoru je následující: monitor obsahuje zámek (monitor lock), který si lze představit jako booleanovskou proměnnou. Při spuštění metody je zámek uzamčen – tato operace musí být tzv. atomická, což je zajišťováno operačním systémem. Dokud je zámek uzamčen, žádná další metoda nesmí být spuštěna. Zámek je pak uvolněn po skončení metody, nebo pokud metoda z nějakého důvodu nemůže pokračovat v běhu – „zablokuje“ se. V druhém případě čekající vlákno poté, co stav blokující jeho další běh pomine, upozorní Monitor, který zajistí bezpečný přechod zpět k vykonávání operací daného vlákna.
Funkci monitoru si lze představit na situaci v rychlém občerstvení, kde je pokladna, u které může být v jednu chvíli právě jeden zákazník. Pokud příprava jídla pro zákazníka trvá déle, zákazník ustoupí stranou a čeká, zatímco jsou obsluhováni další klienti.
Literatura
- Douglas C. Schmidt, Michael Stal, Hans Rohnert, Frank Buschmann "Pattern-Oriented Software Architecture, Volume 2, Patterns for Concurrent and Networked Objects", Wiley, 2000