كيف تجتاز مقابلة Java: أهم الأسئلة المتقدمة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

كيف تجتاز مقابلة Java: أهم الأسئلة المتقدمة



مقابلة منصب مطور Java بمستوى متقدم (Middle/Senior) ليست مجرد اختبار للقواعد النحوية. يرغب المحاورون في رؤية فهم عميق للبنية الداخلية لـ JVM، وتعدد المهام، وخوارزميات عمل جامع القمامة، ودقائق المكتبة القياسية. في هذه المقالة، سنستعرض الأسئلة الأكثر شيوعًا وصعوبة التي ستساعدك على اجتياز المقابلة التقنية بثقة.



1. تعدد المهام والمزامنة: من volatile إلى Lock



تبدأ المقابلة المتقدمة في Java دائمًا تقريبًا بأسئلة حول تعدد المهام. لا تحتاج فقط إلى معرفة الكلمة المفتاحية synchronized، بل تحتاج أيضًا إلى فهم كيفية عمل volatile و AtomicInteger و ReentrantLock وما هو happens-before.



سؤال: ما الفرق بين synchronized و ReentrantLock؟

الفرق الرئيسي هو المرونة. synchronized هو قفل على مستوى مراقب الكائن. يوفر ReentrantLock إمكانيات متقدمة: إمكانية مقاطعة انتظار الخيط (lockInterruptibly())، ومحاولة الاستحواذ دون حظر (tryLock())، بالإضافة إلى دعم شروط متعددة (Condition).



// مثال على استخدام ReentrantLock مع Conditionimport java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks.Condition;

public class BlockingQueueExample { private final ReentrantLock lock = new ReentrantLock(); private final Condition notFull = lock.newCondition(); private final Condition notEmpty = lock.newCondition(); private final Object[] items = new Object[10]; private int putIndex, takeIndex, count;

public void put(Object x) throws InterruptedException { lock.lock(); try { while (count == items.length) { notFull.await(); // ننتظر حتى يتوفر مكان } items[putIndex] = x; if (++putIndex == items.length) putIndex = 0; count++; notEmpty.signal(); // نشير إلى ظهور عنصر } finally { lock.unlock(); } }

public Object take() throws InterruptedException { lock.lock(); try { while (count == 0) { notEmpty.await(); // ننتظر حتى يظهر عنصر } Object x = items[takeIndex]; if (++takeIndex == items.length) takeIndex = 0; count--; notFull.signal(); // نشير إلى تحرر مكان return x; } finally { lock.unlock(); } }}


سؤال: كيف تعمل الكلمة المفتاحية volatile؟

تضمن volatile أن قراءة وكتابة المتغير تتم مباشرة من الذاكرة الرئيسية (main memory)، متجاوزة ذاكرة التخزين المؤقت للمعالج. وهذا يضمن الرؤية للتغييرات لجميع الخيوط، لكنه لا يضمن الذرية (على سبيل المثال، الزيادة count++ لا تزال تتطلب مزامنة).



يجب أيضًا تذكر happens-before: الكتابة في متغير volatile تحدث قبل أي قراءة لاحقة لنفس المتغير من خيط آخر.



2. نموذج ذاكرة Java (JMM) وجامع القمامة



فهم كيفية إدارة JVM للذاكرة هو شرط أساسي لمطور Senior. غالبًا ما يسأل المحاورون عن الأجيال المختلفة (Young/Old Generation)، وأنواع جامعي القمامة، وإعدادات JVM.



سؤال: ما أنواع Garbage Collector الموجودة في Java 17؟

تدعم Java الحديثة (17+) عدة GC:

  • G1GC (Garbage First) — GC الافتراضي. يقسم الكومة إلى مناطق ويجمع القمامة في المناطق التي تحتوي على أكبر عدد من الكائنات الميتة.
  • ZGC (Z Garbage

المدونات

توصيات الكتب