JavaRush /Kurslar /All lectures for UZ purposes /Boshqa sinxronizatsiya va ko'p oqimli dasturlashning tafs...

Boshqa sinxronizatsiya va ko'p oqimli dasturlashning tafsilotlari

All lectures for UZ purposes
Daraja, Dars
Mavjud

— 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
public int y = 1;
public int x = 1;

x=2;
synchronized(mutex)
{
 y = 2;
}
ip mutexning bo'shalishini kutmoqda — mutex
synchronized(mutex)
{
 if (y == x)
 System.out.println("YES");
}

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.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION