– Szia Amigo!

"Van ez a hatalmas téma – a Java memóriamodell. Alapvetően még nem kell tudnia róla, de hasznos lesz hallani róla."

"Az összes lehetséges probléma kiküszöbölése érdekében a Java megváltoztatta a memóriakezelési mechanizmusát. A memória most már nem egyszerűen egy szál helyi gyorsítótárára és globális memóriájára van felosztva – a mechanizmus még jobb."

– És még bonyolultabb!

"Igen, jobb és bonyolultabb. Olyan, mint egy repülőgép. Repülővel jobb, mint gyalogolni, de bonyolultabb. Megpróbálom nagyon egyszerűen elmagyarázni az új helyzetet."

"Íme, amit kitaláltak. A kódhoz hozzáadták a helyi szálmemória szinkronizálására szolgáló mechanizmust, az úgynevezett "előtt történik". Számos szabályt/feltételt találtak ki. Ha ezek a feltételek teljesülnek, a memória szinkronizálódik vagy frissül az aktuálisra állapot.

"Íme egy példa:"

Rendelés 1. szál 2. szál
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;
}
A szál a mutex felszabadulására vár

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

"Az egyik ilyen feltétel a felszabadult mutex megszerzése. Ha egy mutexet felszabadítanak és újra beszereznek, akkor a memória szinkronizálásra kerül az akvizíció előtt. A 2. szál az x és y változók "legújabb" értékeit fogja látni, még akkor is, ha nem nyilvánítod őket változékonynak."

"Milyen érdekes! És sok ilyen állapot van?"

"Elég – íme néhány feltétel a memória szinkronizálásához:"

  • "Egyetlen szálon belül minden parancs megtörténik – minden művelet előtt, amely azt követi a forráskódban."
  • "A zár feloldása megtörténik, mielőtt ugyanazt a zárat megszerezné."
  • "A szinkronizált blokkból/módszerből  való kilépés megtörténik, mielőtt a szinkronizált blokkot/módszert beírná ugyanazon a monitoron."
  • "Egy illékony mező memóriába írása megtörténik – mielőtt ugyanazt az illékony mezőt kiolvassák a memóriából."
  • "A Thread objektum futtatási metódusának vége megtörténik – mielőtt a join() metódus véget ér, vagy az isAlive() metódus hamis értéket ad vissza az ugyanabban a szálban lévő objektumon."
  • "A Thread objektum start() metódusának hívása megtörténik, mielőtt a run() metódus elindulna az objektumon ugyanabban a szálban."
  • "A konstruktor vége az osztály finalize() metódusának kezdete előtt történik ."
  • "Az interrupt() metódus hívása megtörténik, mielőtt a szál megállapítaná, hogy ez a metódus meghívásra került, vagy azért, mert egy InterruptedException került kidobásra, vagy az isInterrupted() vagy interrupted() metódusok használatával."

– Szóval, ez az egész kicsit bonyolultabb, mint gondoltam?

– Igen, kicsit bonyolultabb…

"Köszönöm, Rishi. Gondolkozom rajta."

"Ne törődj túl sokat ezzel a témával. Eljön az idő, amikor mindent meg fogsz érteni egyedül. Egyelőre jobb lenne, ha megérted az alapokat, mintsem belemerülsz a sűrű erdőbe. a Java gép belső működését. Kiadják a Java 9-et, majd újra minden megváltozik."

"O_o. Igen... Néhány dolgot jobb nem tudni."