"Hallo Amigo!"

"Er is een enorm onderwerp: het Java-geheugenmodel. In principe hoef je er nog niets van te weten, maar het zal nuttig zijn om erover te horen."

"Om alle potentiële problemen op te lossen, heeft Java het mechanisme voor geheugenbeheer gewijzigd. Nu wordt het geheugen niet simpelweg verdeeld in de lokale cache van een thread en het globale geheugen - het mechanisme is zelfs nog beter."

"En ingewikkelder!"

"Ja, beter en ingewikkelder. Het is net een vliegtuig. Vliegen met het vliegtuig is beter dan lopen, maar ingewikkelder. Ik zal proberen de nieuwe situatie heel eenvoudig uit te leggen."

"Dit is wat ze bedachten. Een mechanisme voor het synchroniseren van lokaal thread-geheugen, 'happens-before' genaamd, is aan de code toegevoegd. Er zijn verschillende regels/voorwaarden bedacht. Wanneer aan deze voorwaarden is voldaan, wordt het geheugen gesynchroniseerd of bijgewerkt naar de huidige staat.

"Hier is een voorbeeld:"

Volgorde Draad 1 Draad 2
1
2

101
102
103
104
105

201
202
203
204
205
public int y = 1;
public int x = 1;

x = 2;
synchronized(mutex)
{
 y = 2;
}
De thread wacht op de release van de mutex

synchronized(mutex)
{
 if (y == x)
 System.out.println("YES");
}

"Een van deze voorwaarden is de acquisitie van de vrijgegeven mutex. Als een mutex wordt vrijgegeven en opnieuw wordt verkregen, wordt het geheugen gesynchroniseerd vóór de acquisitie. Thread 2 ziet de 'nieuwste' waarden van de variabelen x en y, zelfs als je verklaart ze niet vluchtig."

"Wat interessant! En zijn er veel van deze aandoeningen?"

"Genoeg - hier zijn enkele voorwaarden voor het synchroniseren van geheugen:"

  • "Binnen een enkele thread gebeurt elk commando vóór elke bewerking die erop volgt in de broncode."
  • "De ontgrendeling van een slot gebeurt voordat hetzelfde slot wordt verkregen."
  • "Een gesynchroniseerd blok/methode  wordt verlaten voordat het gesynchroniseerde blok/methode op dezelfde monitor wordt ingevoerd."
  • "Het schrijven van een vluchtig veld naar het geheugen gebeurt voordat hetzelfde vluchtige veld uit het geheugen wordt gelezen."
  • "De run-methode van een Thread-object wordt beëindigd voordat de methode join() of de methode isAlive() false retourneert voor het object in dezelfde thread."
  • "Een aanroep naar de methode start() van een Thread-object vindt plaats voordat de methode run() op het object in dezelfde thread start."
  • "Het einde van de constructor gebeurt vóór het begin van de methode finalize() van deze klasse."
  • "De methode interrupt() wordt aangeroepen voordat de thread bepaalt dat deze methode is aangeroepen, hetzij omdat een InterruptedException wordt gegenereerd, hetzij door de methode isInterrupted() of interrupted() te gebruiken."

"Dus het is allemaal wat ingewikkelder dan ik dacht?"

"Ja, een beetje ingewikkelder..."

"Dank je, Rishi. Ik zal erover nadenken."

"Maak je niet te veel zorgen over dit onderwerp. Er komt een tijd dat je het allemaal zelf zult begrijpen. Voor nu is het beter voor je om de basis te begrijpen, in plaats van je te verdiepen in het dichte bos dat de interne werking van de Java-machine. Java 9 wordt uitgebracht en dan verandert alles weer."

"O_o. Ja... Sommige dingen kun je beter niet weten."