Őrzött felfüggesztés

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.

Használata szerkesztés

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 szerkesztés

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.

Források szerkesztés

Fordítás szerkesztés

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.