Java necə işləyir

Mövzu seç, kod yaz və daxildə nə baş verdiyini addım-addım gör.

Memory

Collection-lar

Concurrency

Dil və JVM

Mövzular

Virtual Thread-lər

Platform thread bahalıdır

Adi Thread əməliyyat sisteminin thread-idir. Onun öz stack-i var, yaradılması və thread-lər arasında keçid bahalıdır.

Ona görə serverlər thread pool işlədir. Amma pool-dakı thread cavab gözləyəndə heç nə etmir. 200 thread varsa, eyni anda yalnız 200 sorğu gözləyə bilər.

Java 21-də virtual thread-lər gəldi. Onlar JVM-in öz thread-ləridir və milyonlarla yaradıla bilər.

Mount və unmount

Virtual thread özü CPU-da işləmir. Onu az sayda platform thread icra edir. Bu thread-lərə carrier deyilir və onlar ForkJoinPool-dadır.

Virtual thread sleep, socket və ya lock gözləyəndə carrier-dən unmount olur: onun stack-i heap-ə köçürülür və carrier növbəti virtual thread-i götürür.

Gözləmə bitəndə virtual thread növbəyə qayıdır və boş olan istənilən carrier-də davam edir. Rejimi dəyiş və vaxtları müqayisə et.

Pinning

Java 21-də virtual thread synchronized daxilində unmount ola bilmir, çünki monitor carrier thread-ə bağlıdır. Buna pinning deyilir: gözləmə müddətində carrier də gözləyir.

Native method daxilində də eyni şey olur. -Djdk.tracePinnedThreads=short belə yerləri göstərir.

Java 21-də həll yolu ReentrantLock-dur. Java 24-də (JEP 491) synchronized artıq pinning yaratmır.

Nə vaxt kömək etmir

Virtual thread-lər gözləyən işi ucuzlaşdırır, hesablamanı isə sürətləndirmir. CPU işi üçün nüvə sayı qədər thread kifayətdir.

Onlar sadəcə ucuz thread-lərdir. Eyni anda neçə iş gedəcəyini məhdudlaşdırmaq üçün pool deyil, Semaphore işlədilir.