4-modul · 2-dars: Race Condition · Synchronized · Volatile · Deadlock
Daraja: O'rta
Race Condition · Synchronized · Volatile · Deadlock. Multithreading va I/O bo‘yicha nazariya, amaliy namuna va mustaqil mashq.
Tushuntirish
## Dars maqsadi Race Condition · Synchronized · Volatile · Deadlock tushunchalarini farqlash, nima uchun kerakligini izohlash va kichik misolda qo‘llash.
## Nazariya Bir nechta thread umumiy ma'lumotni bir vaqtda o'zgartirganda, natija bajarilish tartibiga bog'lib qolib, noto'g'ri chiqishi.
Sinxronizatsiya bilan: `synchronized`, `Lock`, atomic class lar yoki immutable/thread-safe strukturalar orqali.
## Intervyuga tayyorgarlik ### Race condition qanday muammo? Bir nechta thread umumiy ma'lumotni bir vaqtda o'zgartirganda, natija bajarilish tartibiga bog'lib qolib, noto'g'ri chiqishi.
### Race condition-ni qanday oldini olamiz? Sinxronizatsiya bilan: `synchronized`, `Lock`, atomic class lar yoki immutable/thread-safe strukturalar orqali.
### Lock nima? Umumiy resursga bir vaqtda faqat bitta thread kirishini ta'minlaydigan mexanizm (qulf).
### ReentrantLock qanday class? `Lock` interfeysining moslashuvchan implementatsiyasi; bir thread qulfni qayta olishi (reentrant), `tryLock`, `lockInterruptibly`, fairness imkonlari bor.
### ReentrantLock va Synchronized keyword farqi? synchronized — til darajasida, avtomatik ochiladi. ReentrantLock — qo'lda `lock()/unlock()`, `tryLock`, timeout, fairness, bir necha Condition.
### ReentrantLock-ning Synchronized dan qanday afzalliklari bor? `tryLock` (bloklanmasdan urinish), timeout bilan kutish, interrupt qilinadigan kutish, adolatlilik (fairness), bir nechta Condition.
### Condition nima? Lock bilan bog'liq, thread-larni kutish/xabar berish (wait/notify o'rnida) uchun obyekt (`await()`, `signal()`).
### Condition interface nima uchun ishlatiladi? ReentrantLock bilan aniq shartlar bo'yicha threadlarni kutish/uyg'otish uchun (`wait/notify` ning moslashuvchan varianti).
### Synchronized nima? Kod bloki yoki methodga bir vaqtda faqat bitta thread kirishini ta'minlaydigan keyword (monitor lock).
### Necha xil levelda synchronized ishlatishimiz mumkin? 2 xil: method darajasida (`synchronized` method) va blok darajasida (`synchronized(obj){}`); har biri instance yoki static (class) qulfida.
### Nima uchun wait() va notify() synchronized blockdan chaqiriladi? Chunki ular obyekt monitorini (lock) talab qiladi; aks holda `IllegalMonitorStateException` tashlanadi.
### Synchronized method va block farqi? Method — butun methodni qulflaydi. Block — faqat kerakli qismni va istalgan obyekt qulfini tanlash imkonini beradi (aniqroq, tezroq).
### Static synchronized method va synchronized method farqi? Oddiy synchronized — instance (obyekt) qulfi; static synchronized — class (Class obyekti) qulfi. Ular alohida qulflar.
### Volatile nima? O'zgaruvchi qiymati har doim asosiy xotiradan o'qiladi/yoziladi; thread-lar orasidagi ko'rinish (visibility) ni ta'minlaydi.
### Volatile keywordni nimalarga qo'llashimiz mumkin? O'zgaruvchi (field) larga; bir thread yozib, boshqasi o'qiydigan flag/holat uchun.
### Volatile keyword classni thread safe qiladimi? To'liq emas. Faqat ko'rinishni ta'minlaydi, lekin atomik emas — `count++` kabi compound amallar baribir xavfli.
### Volatile keyword afzalliklari va kamchiliklari? Afzallik: ko'rinish, lock-siz yengil. Kamchilik: atomiklikni bermaydi — faqat oddiy read/write holatlariga yaraydi.
### Deadlock nima? Misol keltiring. Ikki (yoki ko'p) thread bir-biri ushlab turgan qulfni kutib, abadiy to'xtab qolishi. Misol: T1 lockA→lockB kutadi, T2 lockB→lockA kutadi.
### Thread Deadlock ga tushmasligi uchun nima qilamiz? Qulflarni doim bir xil tartibda olish, `tryLock` (timeout), qulflar sonini kamaytirish, imkon bo'lsa lock-siz strukturalar.
### Livelock va Deadlock o'rtasidagi farq? Deadlock — threadlar bloklanib qotib qoladi. Livelock — threadlar bloklanmagan, lekin bir-biriga yo'l berib doim holatini o'zgartiradi va ish bajarilmaydi.
## Versiya va aniqlik Java misollari Java 17 bazasiga mo‘ljallangan. JDK/JRE paketlash usuli distributivga bog‘liq; JVM bayt-kodni interpretatsiya va JIT orqali bajarishi mumkin. GC uchun aniq bajarilish vaqtiga kafolat yo‘q; finalization resurs yopish usuli emas. Thread stop/suspend/resume kabi eski metodlar amaliy yechim emas. Koddagi import, klass yoki tashqi kutubxona kontekstini tekshiring.
## Manbalar [Moduldagi savollar yo‘nalishi](https://github.com/jlkesh/pdp_online_java_lessons/blob/main/interviewquestions/4-module.md) [Rasmiy qo‘llanma](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/package-summary.html) [Sizning avvalgi savol-javob arxivingiz](https://lightyer.uz/java/interview.html)
Kod quyida o‘quv namunasi sifatida berilgan. To‘liq ilova uchun import, dependency va konfiguratsiya kerak bo‘lishi mumkin. SQLni faqat ajratilgan test bazasida bajaring.
Kod misoli
class Counter {
private int value;
synchronized void increment() { value++; }
synchronized int get() { return value; }
}
// volatile int qiymat++ amalini atomik qilib qo'ymaydi.
Keng tarqalgan xatolar
- `volatile` ni `synchronized` o'rnini bosadi deb o'ylash - u faqat ko'rinishni beradi, atomiclikni emas.
- Qulflarni har xil tartibda olish - deadlock uchun eng tez yo'l.
Mashqlar
- Ikki thread bir hisoblagichni oshirsin: `synchronized` siz va bilan natijani solishtiring.
- Ataylab deadlock yozib, `jstack` yoki thread dump bilan uni ko'ring.
Teglar: nazariya, pdp, modul-04