"Hai, Amigo!"

"Terdapat topik besar ini di luar sana—Model Memori Java. Pada asasnya, anda tidak perlu mengetahuinya lagi, tetapi ia akan membantu untuk mendengar tentangnya."

"Untuk menghapuskan semua masalah yang berpotensi, Java menukar mekanisme pengurusan memorinya. Kini memori tidak hanya dibahagikan kepada cache setempat dan memori global thread—mekanismenya lebih baik lagi."

"Dan lebih rumit!"

"Ya, lebih baik dan lebih rumit. Ia seperti kapal terbang. Terbang dengan kapal terbang lebih baik daripada berjalan, tetapi lebih rumit. Saya akan cuba menerangkan situasi baru dengan mudah."

"Inilah yang mereka hasilkan. Mekanisme untuk menyegerakkan memori utas tempatan, yang dipanggil 'berlaku-sebelum', telah ditambahkan pada kod. Beberapa peraturan/syarat telah dicipta. Apabila syarat ini dipenuhi, memori disegerakkan atau dikemas kini kepada semasa negeri.

"Ini contohnya:"

Pesanan Benang 1 Benang 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;
}
Benang sedang menunggu mutex dilepaskan

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

"Salah satu daripada syarat ini ialah pemerolehan mutex yang dilepaskan. Jika mutex dilepaskan dan diperoleh semula, maka memori akan disegerakkan sebelum pemerolehan. Thread 2 akan melihat nilai 'terkini' bagi pembolehubah x dan y, walaupun jika anda tidak mengisytiharkannya tidak menentu."

"Menariknya! Dan adakah terdapat banyak syarat ini?"

"Cukup—berikut ialah beberapa syarat untuk menyegerakkan memori:"

  • "Dalam satu utas, sebarang arahan berlaku-sebelum sebarang operasi yang mengikutinya dalam kod sumber."
  • "Pelepasan kunci berlaku-sebelum kunci yang sama diperoleh."
  • "Keluar daripada blok/kaedah  yang disegerakkan berlaku-sebelum blok/kaedah yang disegerakkan dimasukkan pada monitor yang sama."
  • "Penulisan medan yang tidak menentu kepada ingatan berlaku-sebelum medan yang tidak menentu yang sama dibaca dari ingatan."
  • "Tamat kaedah larian objek Thread berlaku-sebelum kaedah join() tamat atau kaedah isAlive() mengembalikan palsu pada objek dalam thread yang sama."
  • "Panggilan ke kaedah start() objek Thread berlaku-sebelum kaedah run() bermula pada objek dalam thread yang sama."
  • "Tamat pembina berlaku-sebelum permulaan kaedah finalize() kelas ini."
  • "Panggilan kepada kaedah interrupt() berlaku-sebelum benang menentukan bahawa kaedah ini telah dipanggil, sama ada kerana InterruptedException dilemparkan atau dengan menggunakan kaedah isInterrupted() atau interrupted()."

"Jadi, semuanya lebih rumit daripada yang saya fikirkan?"

"Ya, agak rumit…"

"Terima kasih, Rishi. Saya akan fikirkan."

"Jangan terlalu risau tentang topik ini. Akan tiba masanya anda akan memahami semuanya sendiri. Buat masa ini, lebih baik anda memahami perkara asas, daripada menyelami hutan tebal yang menjadi kerja dalaman mesin Java. Java 9 akan dikeluarkan dan kemudian semuanya akan berubah lagi."

"O_o. Ya... Beberapa perkara adalah lebih baik untuk tidak tahu."