Lukitukset

On mahdollista, että useiden järjestelmän töiden on käytettävä ja käsiteltävä samaa objektia. ILock määrittää käytännön, jonka perusteella myönnetään yksinoikeus yhteiskäytössä olevaan objektiin. Kun työ tarvitsee käyttöoikeuden yhteiskäytössä olevaan objektiin, se saa lukituksen kyseiseen objektiin. Kun työ on käsitellyt objektia,se vapauttaa lukituksen.

Lukitus luodaan yleensä silloin, kun yhteiskäytössä oleva objekti luodaan tai lisäosa käyttää sitä ensimmäisen kerran. Toisin sanoen koodissa, jossa on viittaus yhteiskäytössä olevaan objektiin, on viittaus myös sen lukitukseen. Aluksi luodaan lukitus myLock, jonka avulla hallitaan objektin myObject käyttöä:

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

Ympäristö antaa kestävän ILock-toteutuksen. Töiden hallintaohjelma antaa tämän lukituksen ilmentymät työasemien käyttöön. Nämä lukitukset havaitsevat toisensa ja voivat välttää kehämäisen lukkiutuman. (Tämä selitetään pian tarkemmin.)

Aina kun työn koodi edellyttää objektin myObject käyttöä, sen on ensin saatava siihen lukitus. Seuraava katkelma kuvaa lukituksen käyttöä:

...
// myObject-kohdetta on käsiteltävä, joten ensin tarvitaan lukitus siihen.
   try {
	myLock.acquire();
	updateState(myObject);  // käsittele objektia
   } finally {
	lock.release();
}
...

Metodi acquire() ei palaudu, ennen kuin kutsuvalle työlle voidaan myöntää poissulkeva käyttöoikeus lukitukseen. Toisin sanoen, jos jokin muu työ on jo saanut lukituksen, tämä koodi estetään, kunnes lukitus on käytettävissä. Huomaa, että koodi, joka saa lukituksen ja käsittelee myObject-kohdetta, on kääritty try-lohkoon, joten lukituksen voi vapauttaa, jos objektin käsittelyn aikana ilmenee poikkeuksia.

Asia on siis varsin yksinkertainen. Kaikeksi onneksi lukitusten käyttö on helppoa. Ei ole myöskään tarpeen huolehtia siitä, että työ saisi saman lukituksen useita kertoja. Kukin lukitus pitää lukua siitä, montako kertaa mikäkin säie on saanut tai vapauttanut sen, ja se vapautetaan työstä vain, kun vapautusten määrä on yhtä suuri kuin saantien.

Lukkiutuma

Aiemmin on havaittu, että töiden hallintaohjelman lukitukset tunnistavat toisensa ja voivat välttää kehämäisen lukkiutuman. Seuraavassa lukkiutumat selitetään yksinkertaisen tilanteen avulla. Oletetaan, että "työ A" saa "lukituksen A" ja yrittää sitten saada "lukituksen B". Samaan aikaan "lukitus B" on "työllä B", joka odottaa nyt "lukitusta A". Tällainen lukkiutuma osoittaa, että suunnittelussa on ongelma töiden välisten lukitusten suhteen. Edellä kuvattu yksinkertainen tilanne on helppo välttää, mutta mitä enemmän töitä ja lukituksia on käytössä, sitä suurempi on mahdollisuus aiheuttaa vahingossa lukkiutuma.

Ympäristö auttaa lukkiutumien havaitsemisessa. Kun töiden hallintaohjelma havaitsee lukkiutuman, se tulostaa lukkiutumaa kuvaavat vianmääritystiedot lokiin. Sen jälkeen se purkaa lukkiutuman myöntämällä muille töille tilapäisen käyttöoikeuden lukituksiin. On tärkeää testata huolellisesti kaikki toteutukset, joihin kuuluu useita lukituksia, ja korjata kaikki lukkiutumat, jotka ympäristö ilmoittaa.