القيم ذات النطاق
شارك البيانات عبر مكدسات الاستدعاء بأمان دون مخاطر 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
القيم ذات النطاق
متاح
أُنهيت في JDK 25 LTS (JEP 506، سبتمبر 2025).
كيف يعمل
يوفر ScopedValue سياقاً ثابتاً وقابلاً للوراثة ومحدود النطاق. بخلاف ThreadLocal، تُنظَّف القيم ذات النطاق تلقائياً وتعمل مع الخيوط الافتراضية ولا يمكن للمستدعين تعديلها.
توثيق ذو صلة