Concurrency متقدم

شارك البيانات عبر مكدسات الاستدعاء بأمان دون مخاطر ThreadLocal.

✕ Java 8
static final ThreadLocal<User> CURRENT =
    new ThreadLocal<>();
void handle(Request req) {
    CURRENT.set(authenticate(req));
    try { process(); }
    finally { CURRENT.remove(); }
}
✓ Java 25
static final ScopedValue<User> CURRENT =
    ScopedValue.newInstance();
void handle(Request req) {
    ScopedValue.where(CURRENT,
        authenticate(req)
    ).run(this::process);
}
هل ترى مشكلة في هذا الكود؟ أخبرنا.
🔒

ثابتة

يمكن للمستدعين القراءة لكن لا يستطيعون تعديل القيمة ذات النطاق.

🧹

تنظيف تلقائي

لا حاجة لـ remove() يدوي — القيمة محددة النطاق للكتلة.

آمنة مع الخيوط الافتراضية

تعمل بكفاءة مع ملايين الخيوط الافتراضية.

الأسلوب القديم
ThreadLocal
الأسلوب الحديث
ScopedValue
منذ JDK
25
الصعوبة
متقدم
القيم ذات النطاق
متاح

أُنهيت في JDK 25 LTS (JEP 506، سبتمبر 2025).

يوفر ScopedValue سياقاً ثابتاً وقابلاً للوراثة ومحدود النطاق. بخلاف ThreadLocal، تُنظَّف القيم ذات النطاق تلقائياً وتعمل مع الخيوط الافتراضية ولا يمكن للمستدعين تعديلها.

مشاركة 𝕏 🦋 in