Låse

Det kan ske, at flere job i systemet skal have adgang til og arbejde med det samme objekt. ILock definerer protokol til brug for tildeling af eksklusiv adgang til et delt objekt. Når et job skal have adgang til et delt objekt, tildeles det en lås til det pågældende objekt. Når det er færdigt med at arbejde med objektet, frigiver det låsen.

En lås oprettes typisk, når det delte objekt oprettes, eller første gang en plugin har adgang til objektet. Det vil sige, kode, som har en reference til det delte objekt, har også en reference til dets lås. Først oprettes en lås myLock, som skal bruges til at styre adgangen til myObject:

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

Platformen sørger for en robust implementering af ILock. Jobstyringsfunktionen stiller forekomster af denne lås til rådighed for klienter. Disse låse er klar over hinandens eksistens og kan undgå cirkulær baglås (mere herom senere).

Når koden i et job kræver adgang til myObject, skal den først opnå låsen til objektet. Følgende stykke kode viser, hvordan der kan arbejdes med en lås:

...
// Jeg skal arbejde med myObject. Jeg skal have dens lås først.
  try {
	myLock.acquire();
	updateState(myObject);  // arbejder med objektet
   } finally {
	lock.release();
}
...

Metoden acquire() returnerer først, når det kaldende job har opnået eksklusiv adgang til låsen. Det vil sig, at hvis et andet job allerede har opnået låsen, blokeres denne kode, indtil låsen er tilgængelig. Bemærk, at den kode, der opnår låsen og arbejder med myObject, er omgivet af en try-blok, så låsen kan frigives, hvis der opstår undtagelser, mens der arbejdes med objektet.

Låse er ret nemme at bruge. De kan også genindtræde, og det vil sige, at du behøver ikke bekymre dig om, at et job skal opnå den samme lås flere gange. Hver lås holder nøje regnskab med antallet af opnåelser og frigivelser for en bestemt programdel, og en lås kan kun frigives fra et job, når antallet af opnåelser og frigivelser er ens.

Baglås

Tidligere blev det nævnt, at de låse, som jobstyringsfunktionen stiller til rådighed, er klar over hinandens eksistens og er i stand til at undgå cirkulær baglås. I det følgende forklares, hvordan baglås opstår. Antag, at "Job A" opnår "Lås A" og forsøger efterfølgende at opnå "Lås B.". "Lås B" holdes imidlertid af "Job B", som nu er blokeret og venter på "Lås A". Denne type baglås angiver et underliggende designproblem ifm. brugen af låse mellem job. Denne situation er let nok at undgå, men chancerne for at introducere en utilsigtet baglås forøges med stigningen i antallet af job og låse i et design.

Heldigvis kan platformen hjælpe dig med at identificere baglåse. Når jobstyringsfunktionen registrerer en baglås, skriver den fejlfindingsoplysninger til logfilen, hvor den beskriver baglåsen. Derefter bryder den baglåsen ved midlertidigt at tildele adgang til de låse, der ejes af et blokeret job, til andre job, som venter på dem. Det er vigtigt at kontrollere enhver implementering, der involverer flere låse, og rette eventuelle baglåssituationer, som rapporteres af platformen.