जावा साक्षात्कार कैसे पास करें: उन्नत स्तर के शीर्ष प्रश्न
\n\nउन्नत स्तर (Middle/Senior) के जावा डेवलपर पद के लिए साक्षात्कार केवल सिंटैक्स की जाँच नहीं है। साक्षात्कारकर्ता JVM की आंतरिक संरचना, मल्टीथ्रेडिंग, गार्बेज कलेक्टर के कार्य एल्गोरिदम और मानक लाइब्रेरी की बारीकियों की गहरी समझ देखना चाहते हैं। इस लेख में, हम सबसे सामान्य और कठिन प्रश्नों का विश्लेषण करेंगे जो आपको आत्मविश्वास से तकनीकी साक्षात्कार पास करने में मदद करेंगे।
\n\n1. मल्टीथ्रेडिंग और सिंक्रोनाइज़ेशन: volatile से Lock तक
\n\nजावा में उन्नत साक्षात्कार लगभग हमेशा मल्टीथ्रेडिंग के प्रश्नों से शुरू होता है। आपको केवल synchronized कीवर्ड जानने की आवश्यकता नहीं है, बल्कि यह भी समझना होगा कि volatile, AtomicInteger, ReentrantLock कैसे काम करते हैं और happens-before क्या है।
प्रश्न: synchronized और ReentrantLock में क्या अंतर है?
\nमुख्य अंतर लचीलापन है। synchronized ऑब्जेक्ट मॉनिटर स्तर पर लॉकिंग है। ReentrantLock उन्नत सुविधाएँ प्रदान करता है: थ्रेड प्रतीक्षा को बाधित करने की क्षमता (lockInterruptibly()), बिना ब्लॉकिंग के लॉक प्राप्त करने का प्रयास (tryLock()), और कई शर्तों (Condition) का समर्थन।
// ReentrantLock का Condition के साथ उपयोग का उदाहरण\nimport java.util.concurrent.locks.ReentrantLock;\nimport java.util.concurrent.locks.Condition;\n\npublic class BlockingQueueExample {\n private final ReentrantLock lock = new ReentrantLock();\n private final Condition notFull = lock.newCondition();\n private final Condition notEmpty = lock.newCondition();\n private final Object[] items = new Object[10];\n private int putIndex, takeIndex, count;\n\n public void put(Object x) throws InterruptedException {\n lock.lock();\n try {\n while (count == items.length) {\n notFull.await(); // जगह खाली होने तक प्रतीक्षा करें\n }\n items[putIndex] = x;\n if (++putIndex == items.length) putIndex = 0;\n count++;\n notEmpty.signal(); // संकेत दें कि एक तत्व आ गया है\n } finally {\n lock.unlock();\n }\n }\n\n public Object take() throws InterruptedException {\n lock.lock();\n try {\n while (count == 0) {\n notEmpty.await(); // तत्व आने तक प्रतीक्षा करें\n }\n Object x = items[takeIndex];\n if (++takeIndex == items.length) takeIndex = 0;\n count--;\n notFull.signal(); // संकेत दें कि जगह खाली हो गई है\n return x;\n } finally {\n lock.unlock();\n }\n }\n}\n\nप्रश्न: volatile कीवर्ड कैसे काम करता है?
\nvolatile गारंटी देता है कि वेरिएबल का पढ़ना और लिखना सीधे मुख्य मेमोरी (main memory) से होता है, प्रोसेसर कैश को छोड़कर। यह सभी थ्रेड्स के लिए परिवर्तनों की दृश्यता सुनिश्चित करता है, लेकिन परमाणुता की गारंटी नहीं देता (उदाहरण के लिए, count++ इंक्रीमेंट के लिए अभी भी सिंक्रोनाइज़ेशन की आवश्यकता है)।
साथ ही happens-before को याद रखें: volatile वेरिएबल में लिखना, उसी वेरिएबल के किसी अन्य थ्रेड से बाद में पढ़ने से पहले होता है।
2. जावा मेमोरी मॉडल (JMM) और गार्बेज कलेक्टर
\n\nJVM मेमोरी प्रबंधन को समझना Senior डेवलपर के लिए अनिवार्य आवश्यकता है। साक्षात्कारकर्ता अक्सर विभिन्न पीढ़ियों (Young/Old Generation), गार्बेज कलेक्टर के प्रकार और JVM कॉन्फ़िगरेशन के बारे में पूछते हैं।
\n\nप्रश्न: Java 17 में किस प्रकार के Garbage Collector मौजूद हैं?
\nआधुनिक Java (17+) कई GC का समर्थन करता है:
\n- \n
- G1GC (Garbage First) — डिफ़ॉल्ट GC। हीप को क्षेत्रों में विभाजित करता है और सबसे अधिक मृत ऑब्जेक्ट वाले क्षेत्रों में कचरा एकत्र करता है। \n
- ZGC (Z Garbage