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