"Ciao, Amico!"

"Nelle mie lezioni precedenti, a volte usavo le parole 'mutex' e 'monitor', ora è il momento di dirti cosa significano."

"Sono tutto orecchie."

"Un mutex è un oggetto speciale per la sincronizzazione di thread/processi. Ha due stati possibili: occupato e libero. Semplificando, un mutex è una variabile booleana che può avere due valori: occupato (vero) e libero (falso)."

"Quando un thread vuole assumere la proprietà di un oggetto, contrassegna il mutex dell'oggetto come occupato. E quando ha finito di lavorare con l'oggetto, contrassegna il suo mutex come libero."

"In altre parole, un mutex è come un cartello 'occupato/libero' sulla porta?"

"Sì. E un tale mutex è associato a ogni oggetto in Java. Solo la macchina Java ha accesso diretto al mutex. È nascosto al programmatore."

"Come lo usiamo allora?"

"In Java, possiamo lavorare con un mutex attraverso un monitor."

"Un monitor è un meccanismo speciale (pezzo di codice) sovrapposto a un mutex. Garantisce una corretta interazione con il mutex. Non è sufficiente contrassegnare un oggetto come occupato. È comunque necessario assicurarsi che altri thread non tentino di usa l'oggetto occupato."

"In Java, i monitor vengono implementati utilizzando la parola chiave sincronizzato."

"Quando scrivi un blocco sincronizzato, il compilatore Java lo sostituisce con tre pezzi di codice:"

1) All'inizio del blocco sincronizzato, viene aggiunto il codice che contrassegna il mutex come occupato.

2)  Alla fine del blocco sincronizzato, viene aggiunto il codice che contrassegna il mutex come libero.

3)  Prima del blocco sincronizzato viene aggiunto del codice che, se il mutex è occupato, fa sì che il thread attenda fino al rilascio del mutex.

"Ecco più o meno come funziona:"

Codice Come funziona Descrizione
synchronized(object)
{

object.doJob();

}
while (object.mutex)
Thread.sleep(1);

object.mutex = true;

object.doJob();

object.mutex = false;

Il thread dorme finché il mutex è occupato
(usciremo dal ciclo quando il mutex viene rilasciato). Contrassegna il mutex come occupato.

Eseguire doTask();

Contrassegna il mutex come libero

"In realtà la logica lì è diversa e più complicata. Ma questi sono solo dettagli".

"Posso avere i dettagli?"

"Fino a quando non impari a usarlo correttamente, non ha senso rimanere aggrovigliato nei dettagli."

"Un paio di livelli fa ti ho fornito un elenco di tutti gli stati dei thread con frecce di transizione e un elenco di metodi che influenzano questo stato. Ti ricordi molto?"

"Non proprio. Dimentico tutto così in fretta..."

"Meno pratica fai, meno benefici dalla teoria."

"Al livello 40, imparerai come usare tutto questo, e ti spiegherò come funziona davvero. Nel frattempo, impara solo a usarlo correttamente. Capito?"

"Sì, grazie, Ellie."