Az őrzött felfüggesztés[1] egy konkurrens 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.
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.
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.
Ez a szócikk részben vagy egészben a Guarded suspension című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.