"Hei, Amigo!"

"Det er dette enorme emnet der ute - Java Memory Model. I utgangspunktet trenger du ikke å vite om det ennå, men det vil være nyttig å høre om det."

"For å eliminere alle potensielle problemer, endret Java sin minnestyringsmekanisme. Nå er ikke minne bare delt inn i en tråds lokale hurtigbuffer og globale minne - mekanismen er enda bedre."

"Og mer komplisert!"

"Ja, bedre og mer komplisert. Det er som et fly. Å fly med fly er bedre enn å gå, men mer komplisert. Jeg skal prøve å forklare den nye situasjonen veldig enkelt."

"Her er hva de kom opp med. En mekanisme for synkronisering av lokalt trådminne, kalt "hender-før", ble lagt til koden. Flere regler/betingelser ble oppfunnet. Når disse betingelsene er oppfylt, blir minnet synkronisert eller oppdatert til gjeldende stat.

"Her er et eksempel:"

Rekkefølge 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 mutexen skal slippes

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

"En av disse betingelsene er anskaffelsen av den frigitte mutexen. Hvis en mutex frigjøres og gjenanskaffes, vil minnet bli synkronisert før anskaffelsen. Tråd 2 vil se de 'siste' verdiene til variablene x og y, selv om du erklærer dem ikke flyktige."

"Hvor interessant! Og er det mange av disse forholdene?"

"Nok - her er noen betingelser for synkronisering av minne:"

  • "Innenfor en enkelt tråd skjer enhver kommando - før enhver operasjon som følger den i kildekoden."
  • "Utløsningen av en lås skjer - før den samme låsen er anskaffet."
  • "En utgang fra en synkronisert blokk/metode  skjer - før den synkroniserte blokken/metoden legges inn på samme monitor."
  • "Skrivingen av et flyktig felt til minnet skjer - før det samme flyktige feltet leses fra minnet."
  • "En avslutning på et Thread-objekts kjøremetode skjer - før join()-metoden avsluttes eller isAlive()-metoden returnerer false på objektet i samme tråd."
  • "Et kall til et Thread-objekts start()-metode skjer-før run()-metoden starter på objektet i samme tråd."
  • "Slutten på konstruktøren skjer - før begynnelsen av denne klassens finalize()-metode."
  • "Et kall til interrupt()-metoden skjer-før tråden bestemmer at denne metoden har blitt kalt, enten fordi en InterruptedException blir kastet eller ved å bruke metodene isInterrupted() eller interrupted()."

"Så, det hele er litt mer komplisert enn jeg trodde?"

"Ja, litt mer komplisert..."

"Takk, Rishi. Jeg skal tenke på det."

"Ikke bekymre deg for mye om dette emnet. Tiden kommer da du vil forstå alt på egenhånd. Foreløpig ville det være bedre for deg å forstå det grunnleggende, i stedet for å dykke ned i den tette skogen som er intern drift av Java-maskinen. Java 9 vil bli utgitt og så vil alt endre seg igjen."

"O_o. Ja... Noen ting er det bedre å ikke vite."