"Hai, Amigo!"
"Ada topik besar di luar sana—Model Memori Java. Pada dasarnya, Anda belum harus mengetahuinya, tetapi akan sangat membantu untuk mendengarnya."
"Untuk menghilangkan semua potensi masalah, Java mengubah mekanisme manajemen memorinya. Sekarang memori tidak hanya dibagi menjadi cache lokal thread dan memori global—mekanismenya bahkan lebih baik."
"Dan lebih rumit!"
"Ya, lebih baik dan lebih rumit. Ini seperti pesawat terbang. Terbang dengan pesawat lebih baik daripada berjalan kaki, tetapi lebih rumit. Saya akan mencoba menjelaskan situasi baru dengan sangat sederhana."
"Inilah yang mereka buat. Sebuah mekanisme untuk menyinkronkan memori utas lokal, yang disebut 'terjadi-sebelumnya', ditambahkan ke kode. Beberapa aturan/kondisi diciptakan. Ketika kondisi ini terpenuhi, memori disinkronkan atau diperbarui ke saat ini negara.
"Ini contohnya:"
Memesan | Utas 1 | Utas 2 |
---|---|---|
1 2 … 101 102 103 104 105 … 201 202 203 204 205 |
|
Utas sedang menunggu mutex dirilis
|
"Salah satu syarat ini adalah akuisisi mutex yang dirilis. Jika mutex dirilis dan diperoleh kembali, maka memori akan disinkronkan sebelum akuisisi. Utas 2 akan melihat nilai 'terbaru' dari variabel x dan y, bahkan jika Anda tidak menyatakan mereka tidak stabil."
"Menarik sekali! Dan apakah ada banyak kondisi seperti ini?"
"Cukup—ini beberapa syarat untuk menyinkronkan memori:"
- "Dalam satu utas, perintah apa pun terjadi-sebelum operasi apa pun yang mengikutinya dalam kode sumber."
- "Pelepasan kunci terjadi-sebelum kunci yang sama diperoleh."
- "Keluar dari blok/metode yang disinkronkan terjadi-sebelum blok/metode yang disinkronkan dimasukkan pada monitor yang sama."
- "Penulisan bidang volatil ke memori terjadi-sebelum bidang volatil yang sama dibaca dari memori."
- "Akhir dari metode run objek Thread terjadi-sebelum metode join() berakhir atau metode isAlive() mengembalikan false pada objek di thread yang sama."
- "Pemanggilan ke metode start() objek Thread terjadi-sebelum metode run() dimulai pada objek di thread yang sama."
- "Akhir dari konstruktor terjadi-sebelum dimulainya metode finalize() kelas ini."
- "Pemanggilan ke metode interrupt() terjadi-sebelum utas menentukan bahwa metode ini telah dipanggil, baik karena InterruptedException dilemparkan atau dengan menggunakan metode isInterrupted() atau interrupted()."
"Jadi, semuanya sedikit lebih rumit dari yang kukira?"
"Ya, sedikit lebih rumit ..."
"Terima kasih, Rishi. Aku akan memikirkannya."
"Jangan terlalu khawatir tentang topik ini. Waktunya akan tiba ketika kamu akan memahami semuanya sendiri. Untuk saat ini, akan lebih baik bagimu untuk memahami dasar-dasarnya, daripada mempelajari hutan lebat yang merupakan cara kerja internal mesin Java. Java 9 akan dirilis dan semuanya akan berubah lagi."
"O_o. Ya... Beberapa hal lebih baik tidak diketahui."
GO TO FULL VERSION