Blocchi

È possibile che più lavori del sistema debbano accedere a modificare lo stesso oggetto. ILock definisce il protocollo per garantire l'accesso esclusivo ad un oggetto condiviso. Quando un lavoro deve accedere all'oggetto condiviso, acquisisce un blocco per quell'oggetto. Quando finisce di modificare l'oggetto, rilascia il blocco.

Un blocco viene in genere creato al momento della creazione o del primo accesso di un plugin all'oggetto condiviso. Ciò significa che il codice che presenta un riferimento all'oggetto condiviso presenta anche un riferimento al suo blocco. Verrà creato un blocco, myLock, che verrà utilizzato per controllare l'accesso a myObject:

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

Un'implementazione consistente di ILock viene fornita dalla piattaforma. Il gestore lavori fornisce le istanze per questo blocco che verranno utilizzate dai client. I blocchi sono consapevoli della rispettiva presenza e possono evitare il deadlock circolare.

Quando il codice di un lavoro richiede l'accesso per myObject, deve prima acquisire un blocco. Nel frammento di seguito riportato viene visualizzato un idioma comune per la gestione di un blocco:

...
// I need to manipulate myObject, so I get its lock first.
try {
	myLock.acquire();
	updateState(myObject);  // manipulate the object
	} finally {
	lock.release();
}
...

Il metodo acquire() non viene restituito fino a quando il lavoro che lo richiama non garantisce l'accesso esclusivo al blocco. In altre parole, se altri lavori hanno già acquisito il blocco, questo codice verrà bloccato fino a quando il blocco non risulterà disponibile. Il codice che acquisisce il blocco e modifica myObject viene suddiviso in un blocco try, in modo da poter essere rilasciato qualora si presenti qualche eccezione durante la gestione dell'oggetto.

La procedura sembra semplice. Fortunatamente, i blocchi sono abbastanza facili da utilizzare e non bisogna preoccuparsi del fatto che il lavoro acquisisca lo stesso blocco più volte. Ciascun blocco esegue un certo numero di acquisizione e rilasci per un determinato thread e viene rilasciato da un lavoro solo quando il numero di rilasci è uguale al numero di acquisizioni.

Deadlock

È stato specificato che i blocchi forniti dal gestore blocchi sono consapevoli della rispettiva presenta e possono evitare il daedlock circolare. Per comprendere come si verifica un deadlock, viene utilizzato un semplice scenario. Si supponga che "Lavoro A" acquisisca "Blocco A" e tenti successivamente di acquisire "Blocco B." Nello stesso tempo, "Blocco B" è gestito da "Lavoro B", ora bloccato in attesa di "Blocco A." Questo tipo di deadlock indica un problema di progettazione nell'utilizzo dei blocchi tra i lavori. Mentre questo semplice caso può essere evitato facilmente, le possibilità di introdurre accidentalmente un deadlock aumentano con il numero di lavori e i blocchi utilizzati nella progettazione.

Per fortuna, la piattaforma consente di identificare i deadlock. Quando il gestore lavori individua una condizione di deadlock, visualizza informazioni diagnostiche nel log, che descrivono la condizione di deadlock. Interrompe quindi il deadlock, garantendo temporaneamente l'accesso ai blocchi di un lavoro agli altri lavori in attesa. È importante verificare attentamente qualsiasi implementazione che richiami più blocchi e correggere le condizioni di deadlock riportate dalla piattaforma.