– 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 |
|
A szál a mutex felszabadulására vár
|
"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."
GO TO FULL VERSION