"Hej, Amigo!"

"Der er dette enorme emne derude - Java Memory Model. Dybest set behøver du ikke at vide om det endnu, men det vil være nyttigt at høre om det."

"For at eliminere alle potentielle problemer ændrede Java sin hukommelsesstyringsmekanisme. Nu er hukommelsen ikke blot opdelt i en tråds lokale cache og globale hukommelse - mekanismen er endnu bedre."

"Og mere kompliceret!"

"Ja, bedre og mere kompliceret. Det er ligesom et fly. At flyve med fly er bedre end at gå, men mere kompliceret. Jeg vil forsøge at forklare den nye situation meget enkelt."

"Her er, hvad de kom frem til. En mekanisme til synkronisering af lokal trådhukommelse, kaldet 'happens-before', blev tilføjet til koden. Flere regler/betingelser blev opfundet. Når disse betingelser er opfyldt, synkroniseres hukommelsen eller opdateres til den nuværende stat.

"Her er et eksempel:"

Bestille Tråd 1 Tråd 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;
}
Tråden venter på, at mutex'en bliver frigivet

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

"En af disse betingelser er erhvervelsen af ​​den frigivne mutex. Hvis en mutex frigives og genindhentes, vil hukommelsen blive synkroniseret før optagelsen. Tråd 2 vil se de 'seneste' værdier af variablerne x og y, selvom du erklærer dem ikke for flygtige."

"Hvor interessant! Og er der mange af disse forhold?"

"Nok - her er nogle betingelser for synkronisering af hukommelse:"

  • "Inden for en enkelt tråd sker enhver kommando - før enhver handling, der følger den i kildekoden."
  • "Udgivelsen af ​​en lås sker - før den samme lås er erhvervet."
  • "En udgang fra en synkroniseret blok/metode  sker - før den synkroniserede blok/metode indtastes på den samme skærm."
  • "Skrivningen af ​​et flygtigt felt til hukommelsen sker - før det samme flygtige felt læses fra hukommelsen."
  • "En slutning af et Thread-objekts kørselsmetode sker - før join()-metoden slutter, eller isAlive()-metoden returnerer false på objektet i samme tråd."
  • "Et kald til et Thread-objekts start()-metode sker - før run()-metoden starter på objektet i samme tråd."
  • "Afslutningen af ​​konstruktøren sker - før begyndelsen af ​​denne klasses finalize()-metode."
  • "Et kald til metoden interrupt() sker - før tråden bestemmer, at denne metode er blevet kaldt, enten fordi en InterruptedException er kastet eller ved at bruge metoderne isInterrupted() eller interrupted()."

"Så, det hele er lidt mere kompliceret, end jeg troede?"

"Ja, lidt mere kompliceret..."

"Tak, Rishi. Jeg vil tænke over det."

"Du skal ikke bekymre dig for meget om dette emne. Tiden kommer, hvor du vil forstå det hele på egen hånd. For nu ville det være bedre for dig at forstå det grundlæggende, i stedet for at dykke ned i den tætte skov, der er interne funktioner i Java-maskinen. Java 9 vil blive frigivet, og så vil alt ændre sig igen."

"O_o. Ja... Nogle ting er det bedre ikke at vide."