पाठ 7 / 38

सिंक्रोनाइज़ेशन

synchronized व volatile से रेस कंडीशन व विज़िबिलिटी बग ठीक करें, atomic व ReentrantLock को प्राथमिकता दें, और डेडलॉक से बचने हेतु लॉक एक ही क्रम में लें।

दो समस्याएँ

साझा म्यूटेबल स्टेट से रेस कंडीशन और विज़िबिलिटी बग होते हैं। synchronized दोनों ठीक करता है; volatile केवल विज़िबिलिटी।

atomic व lock को प्राथमिकता

AtomicLong आदि CAS से लॉक-फ़्री अपडेट देते हैं। ReentrantLock में tryLock, टाइमआउट, फ़ेयरनेस मिलते हैं।

private final AtomicLong hits = new AtomicLong();
public void record() { hits.incrementAndGet(); }

private final ReentrantLock lock = new ReentrantLock();
lock.lock();
try { /* critical section */ } finally { lock.unlock(); }

डेडलॉक से बचें

डेडलॉक के लिए दो थ्रेड एक ही दो लॉक उल्टे क्रम में लेते हैं। समाधान: लॉक हमेशा एक ही क्रम में लें।