Az őrzött felfüggesztés egy konkurens programtervezési minta. Olyan műveletekhez használják, amelyek igényelnek egy lockot és egy előfeltételt is teljesíteni kell. Tipikusan metódushívásokhoz használják, és magában foglalja a hívás és a hívó felfüggesztését, ameddig nem teljesül a művelet feltétele.
Használata Mivel blokkol, ezért csak akkor szabad használni, ha tudjuk, hogy a feltétel véges idő múlva biztos teljesülni fog. Ha a felfüggesztés túl sokáig tart,akkor az egész program leállhat, vagy lelassulhat a feltétel teljesülésére várva. Ha előfordulhat, hogy a feltétel hosszú ideig nem teljesül, akkor a balking minta az ajánlott.
Megvalósítása Javában az Object osztály biztosítja a wait() és a notify(), valamint a notifyAll() metódusokat az őrzött felfüggesztéshez. Az alábbi példában, ami eredetileg Kuchana (2004) műve, ha a metódushívás feltétele nem teljesül, akkor a hívónak várnia kell a feltétel teljesülésére.
public class Example { synchronized void guardedMethod() { while (!preCondition()) { try { // Continue to wait wait(); // … } catch (InterruptedException e) { // …
// Actual task implementation
synchronized void alterObjectStateMethod() { // Change the object state // … // Inform waiting threads notify();
Az őrzött felfüggesztés használatára példa lehet egy sor, get() és put() műveletekkel. A get() műveletet elé van látva egy őrrel, ami jelzi, hogy van-e elem a sorban. Ha a put() értesíti a várakozókat arról, hogy elem került a sorba, akkor a get() kiléphet őrzött állapotából, és folytathatja a hívást. Ha a sor kiürül, akkor a get() újra őrzött állapotba kerül.
Jegyzetek
Források .
Fordítás
Kategória:Programtervezési minták Kategória:Java-kódpéldák