"Hallo Amigo!"

"In mijn vorige lessen gebruikte ik soms de woorden 'mutex' en 'monitor', nu is het tijd om je te vertellen wat ze betekenen."

"Ik luister."

"Een mutex is een speciaal object voor het synchroniseren van threads/processen. Het heeft twee mogelijke toestanden: bezet en vrij. Simpel gezegd, een mutex is een booleaanse variabele die twee waarden kan hebben: bezet (true) en vrij (false)."

"Wanneer een thread eigenaar wil worden van een object, markeert het de mutex van het object als bezig. En wanneer het klaar is met werken met het object, markeert het zijn mutex als vrij."

"Met andere woorden, een mutex is als een bordje 'bezet/vrij' op de deur?"

"Ja. En zo'n mutex is gekoppeld aan elk object in Java. Alleen de Java-machine heeft directe toegang tot de mutex. Het is verborgen voor de programmeur."

"Hoe gebruiken we het dan?"

"In Java kunnen we werken met een mutex via een monitor."

"Een monitor is een speciaal mechanisme (stukje code) bovenop een mutex. Het garandeert een goede interactie met de mutex. Het is niet genoeg om een ​​object als bezet te markeren. Het is nog steeds nodig om ervoor te zorgen dat andere threads niet proberen om gebruik het bezet object."

"In Java worden monitoren geïmplementeerd met behulp van het sleutelwoord gesynchroniseerd."

"Als je een gesynchroniseerd blok schrijft, vervangt de Java-compiler het door drie stukjes code:"

1) Aan het begin van het gesynchroniseerde blok wordt code toegevoegd die de mutex als bezet markeert.

2)  Aan het einde van het gesynchroniseerde blok wordt code toegevoegd die de mutex als vrij markeert.

3)  Voor het gesynchroniseerde blok wordt code toegevoegd die, als de mutex bezet is, ervoor zorgt dat de thread wacht tot de mutex wordt vrijgegeven.

"Dit is ongeveer hoe het werkt:"

Code Hoe het werkt Beschrijving
synchronized(object)
{

object.doJob();

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

object.mutex = true;

object.doJob();

object.mutex = false;

De thread slaapt zolang de mutex bezig is
(we verlaten de lus wanneer de mutex wordt losgelaten). Markeer de mutex als bezet.

voer doTask();

Markeer de mutex als vrij

"In werkelijkheid is de logica daar anders en ingewikkelder. Maar dit zijn slechts details."

"Mag ik de details?"

"Totdat je leert hoe je het op de juiste manier gebruikt, heeft het geen zin om verstrikt te raken in de details."

"Een paar niveaus geleden heb ik je een lijst gegeven van alle threadstatussen met overgangspijlen en een lijst met methoden die deze status beïnvloeden. Weet je nog veel?"

"Niet echt. Ik vergeet gewoon alles zo snel..."

"Hoe minder je oefent, hoe minder je profiteert van de theorie."

"Op niveau 40 leer je hoe je dit allemaal kunt gebruiken, en ik zal uitleggen hoe dit allemaal echt werkt. Leer in de tussentijd gewoon om het allemaal op de juiste manier te gebruiken. Begrepen?"

"Ja, dank je wel, Ellie."