— Salom, Amigo!
Java Memory Model degan ulkan mavzu bor. Aslida uni bilish hozircha senga shart emas, lekin eshitib qo'yish foydali bo'ladi.
Java-da bu muammolarni yo'q qilish maqsadida, xotira ishlash mexanizmini o'zgartirishgan. Endi nafaqat xotira lokal kesh ipga va globalga bo'ladi, balki mexanizm yanada yaxshiroq bo'ldi.
— Va murakkabroq!
— Ha, yaxshiroq va murakkabroq. Bu samolyotdek. Samolyotda uchish piyoda yurishdan afzal, lekin murakkabroq. Senga yangi holatni juda soddalashtirib tushuntirishga harakat qilaman.
Mana nima ixtiro qilindi. Kodga "happens before" (to'g'ridan-to'g'ri "oldin sodir bo'lgan") deb nomlangan iplarning lokal xotirasini sinxronizatsiya qilish mexanizmi qo'shildi. Peshindan oldin xotira sinxronlanadigan - aktual holatga yangilanadigan bir qator qoidalar/holatlar kiritildi.
Misol:
| Tartib | Ip 1 | Ip 2 |
|---|---|---|
| 1 2 … 101 102 103 104 105 … 201 202 203 204 205 |
|
ip mutexning bo'shalishini kutmoqda — mutex |
Shunday shartlardan biri – bu bo'shatilgan mutexni qo'lga olish. Agar mutex bo'shatilgan bo'lsa va qayta qo'lga olingan bo'lsa, qo'lga olishdan oldin xotirani sinxronlash amalga oshiriladi. Ip 2 o'zgaruvchilar x va y ning "eng yangi" qiymatlarini ko'radi, hatto ularni volatile deb e'lon qilmasangiz ham.
— Qanday qiziq. Va bu shartlardan ko'pmi?
— Yetarli, mana ba'zi xotira sinxronlash shartlari:
- Bitta ip doirasida har qanday buyruq happens-before (ya'ni "oldin sodir bo'ladi") unga kodda keyin kelgan har qanday operatsiyaga nisbatan.
- Lokni bo'shatish (unlock) happens-before o'sha lokni (lock) qo'lga olish.
- synchronized blok/metoddan chiqish happens-before o'sha monitor toldiruvchi synchronized blok/metodga kirish.
- volatile maydonni yozish happens-before o'sha maydonni o'qish.
- Thread klassining run metodining yakunlanishi happens-before join() metodidan chiqish yoki isAlive() metodining false qaytarishi.
- Thread klassining start() metodini chaqirish happens-before o'sha ipning run() metodining boshlanishi.
- Konstruktorning yakunlanishi happens-before bu klassning finalize() metodining boshlanishi.
- Ipda interrupt() metodini chaqirish happens-before, ip bu metodning chaqirilganini aniqlasa, yo InterruptedException chiqarish orqali, yoki isInterrupted() yoki interrupted() metodlari orqali
— T.e. hammasi men o'ylagandan biroz murakkabroqmi?
— Ha, biroz murakkabroq…
— Rahmat, Risha, o'ylab ko'raman.
— Bu mavzuda ko'p bosh qotirma. Vaqti kelganda, hammasini tushunib olasan. Hozir senga Java dasturiy mashinasining ichki tuzilishiga sho'ng'ishdan ko'ra, asoslarga kirishingiz foydaliroq.
— O_o. M-da. Ba'zi narsalarni yaxshisi bilmaslik kerak.
GO TO FULL VERSION