Zárolások

Előfordulhat, hogy a rendszer több feladata próbálja meg elérni és módosítani ugyanazt a feladatot. ILock egy protokollt ad meg a megosztott objektum kizárólagos hozzáférés megadásához. Amikor a feladatnak hozzá kell férni egy megosztott objektumhoz, akkor egy zárolást szerez az objektumhoz. Ha befejezte az objektum kezelését, akkor elengedi a zárolást.

A zárolás jellemzően megosztott objektum létrehozásakor vagy a bedolgozó általi első hozzáféréskor kerül létrehozásra. A megosztott objektumra hivatkozó kód a zárolásra is tartalmaz hivatkozást. A myLock zárolás létrehozásával kezdjük, amely szabályozza a myObject elérését:

   ...
   myObject = initializeImportantObject();
   IJobManager jobMan = Platform.getJobManager();
   myLock = jobMan.newLock();
   ...

Az ILock robusztus megvalósítását a platform biztosítja. A feladatkezelő biztosítja a zárolás példányait az ügyfél számára. Ezek a zárolások tudnak egymásról, és elkerülhetik a körkörös holtpontot. (Az utasítást részletesebben is elmagyarázzuk.)

Ha a feladatban lévő kódnak hozzá kell férnie a myObject metódushoz, akkor először szereznie kell egy zárolást. Az alábbi részlet megjelenít egy általános kifejezést a zárolás kezeléséhez:

...
// Kezelnem kell a myObject metódust, ezért először ezt zárolom.
try {		
	myLock.acquire();
	updateState(myObject);  // kezeli az objektumot
} finally {
	lock.release();
}
...

Az acquire() metódus nem tér vissza addig, amíg a meghívó feladat nem kap kizárólagos hozzáférést a zároláshoz. Más szavakkal, ha egy másik feladat már megszerezte a zárolást, akkor ez a kód blokkolásra kerül addig, amíg a zárolás elérhető nem lesz. Ne feledje el, hogy a kód, amely megszerzi a zárolást és kezeli a myObject elemet, bekerül egy try blokkba, így a zárolás felengedhető, ha az objektum kezelése során kivétel történik.

Elég egyszerűnek tűnik, nem? Szerencsére a zárolások használata elég egyszerű. Újrahívhatók, ami azt jelenti, hogy nem kell aggódni amiatt, hogy a feladat ugyanazt a zárolást többször megszerzi. Minden zárolás eltárolja a megszerzések és elengedések számát egy adott szálhoz, és csak akkor kerül elengedésre egy feladattól, ha az elengedések száma egyenlő a szerzések számával.

Holtpont

Korábban megjegyeztük, hogy a feladatkezelő által biztosított zárolások tudnak egymásról, és el tudják kerülni a holtpontot. Annak megértéséhez, hogy a holtpont hogyan következik be, tekintsünk meg egy egyszerű példahelyzetet. Tételezzük fel, hogy a "Job A" megszerzi a "Lock A" zárolást, majd ezt követően megpróbálja megszerezni a "Lock B" zárolást. A "Lock B" zárolást a "Job B" tartja, amely blokkolva van, és vár a "Lock A" zárolásra. Ez a fajta holtpont az alapul szolgáló kialakítás problémáját jelzi a zárolások feladatok közötti használatával. Ez az egyszerű eset könnyen elkerülhető, a holtpontok kialakulásának esélye a feladatok és a használt zárolások számával együtt növekszik.

Szerencsére a platform segítséget nyújt a holtpontok felismerésében. Ha a feladatkezelő holtponthelyezetet észlel, akkor a diagnosztikai információkat a holtponthelyzetet leíró naplóba írja. Ezután megszünteti a holtpontot azáltal, hogy ideiglenes hozzáférést biztosít a blokkolt feladat által birtokolt zároláshoz a másik feladatnak, amely erre vár. A több zárolást tartalmazó megvalósítást kerültekintően kell tesztelni, és ki kell küszöbölni a platform által jelentett holtponthelyezeteket.