"Hi, Amigo!"

"Mayroong napakalaking paksa doon—ang Java Memory Model. Karaniwan, hindi mo pa kailangang malaman ang tungkol dito, ngunit makakatulong na marinig ang tungkol dito."

"Upang alisin ang lahat ng mga potensyal na problema, binago ng Java ang mekanismo ng pamamahala ng memorya nito. Ngayon ang memorya ay hindi lamang nahahati sa lokal na cache ng thread at pandaigdigang memorya—mas mabuti pa ang mekanismo."

"At mas kumplikado!"

"Oo, mas maganda at mas kumplikado. Parang eroplano. Ang paglipad sa eroplano ay mas mahusay kaysa sa paglalakad, ngunit mas kumplikado. Susubukan kong ipaliwanag ang bagong sitwasyon nang napakasimple."

"Narito kung ano ang kanilang naisip. Isang mekanismo para sa pag-synchronize ng lokal na memorya ng thread, na tinatawag na 'nangyayari-bago', ay idinagdag sa code. Ilang mga panuntunan/kondisyon ang naimbento. Kapag ang mga kundisyong ito ay nasiyahan, ang memorya ay na-synchronize o na-update sa kasalukuyang estado.

"Narito ang isang halimbawa:"

Umorder Thread 1 Thread 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;
}
Ang thread ay naghihintay para sa mutex na ilabas

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

"Isa sa mga kundisyong ito ay ang pagkuha ng inilabas na mutex. Kung ang isang mutex ay inilabas at muling nakuha, ang memorya ay isi-synchronize bago ang pagkuha. Ang Thread 2 ay makikita ang 'pinakabago' na mga halaga ng mga variable na x at y, kahit na kung hindi mo idineklara ang mga ito na pabagu-bago."

"How interesting! At marami ba itong kundisyon?"

"Sapat na—narito ang ilang kundisyon para sa pag-synchronize ng memory:"

  • "Sa loob ng isang thread, anumang utos ang mangyayari-bago ang anumang operasyon na sumusunod dito sa source code."
  • "Ang paglabas ng isang lock ay nangyayari-bago ang parehong lock ay nakuha."
  • "Maganap ang isang exit mula sa isang naka-synhronize na block/paraan  -bago ipasok ang naka-synchronize na block/paraan sa parehong monitor."
  • "Ang pagsulat ng isang pabagu-bago ng isip na patlang sa memorya ay nangyayari-bago ang parehong pabagu-bago ng patlang ay basahin mula sa memorya."
  • "Maganap ang pagtatapos ng paraan ng pagtakbo ng Thread object -bago magtapos ang join() method o ang isAlive() method ay nagbabalik ng false sa object sa parehong thread."
  • "Ang isang tawag sa pamamaraan ng start() ng isang Thread object ay nangyayari-bago magsimula ang run() na pamamaraan sa object sa parehong thread."
  • "Ang pagtatapos ng constructor ay nangyayari-bago ang simula ng pamamaraan ng finalize() ng klase na ito."
  • "Ang isang tawag sa interrupt() na pamamaraan ay nangyayari-bago matukoy ng thread na ang pamamaraang ito ay tinawag, alinman dahil ang isang InterruptedException ay itinapon o sa pamamagitan ng paggamit ng isInterrupted() o interrupted() na mga pamamaraan."

"So, ang lahat ng ito ay medyo mas kumplikado kaysa sa naisip ko?"

"Oo, medyo mas kumplikado..."

"Salamat, Rishi. Pag-iisipan ko."

"Huwag kang masyadong mag-alala tungkol sa paksang ito. Darating ang panahon na mauunawaan mo ang lahat ng ito sa iyong sarili. Sa ngayon, mas mabuting intindihin mo muna ang mga pangunahing kaalaman, kaysa lumubog sa masukal na kagubatan na siyang panloob na paggana ng Java machine. Ilalabas ang Java 9 at magbabago muli ang lahat."

"O_o. Oo... May mga bagay na mas mabuting hindi alam."