Java nasıl çalışır

Konu seç, kod yaz ve içeride ne olduğunu adım adım gör.

Memory

Collection'lar

Concurrency

Dil ve JVM

Konular

Virtual Thread'ler

Platform thread pahalıdır

Sıradan bir Thread işletim sisteminin thread'idir. Kendi stack'i vardır, oluşturmak ve thread'ler arasında geçiş yapmak pahalıdır.

Bu yüzden sunucular thread pool kullanır. Ama pool'daki thread cevap beklerken hiçbir şey yapmaz. 200 thread varsa aynı anda sadece 200 istek bekleyebilir.

Java 21'de virtual thread'ler geldi. Onlar JVM'in kendi thread'leridir ve milyonlarca oluşturulabilir.

Mount ve unmount

Virtual thread kendisi CPU'da çalışmaz. Onu az sayıda platform thread çalıştırır. Bu thread'lere carrier denir ve ForkJoinPool'dadırlar.

Virtual thread sleep, socket veya lock beklerken carrier'dan unmount olur: stack'i heap'e taşınır ve carrier sıradaki virtual thread'i alır.

Bekleme bitince virtual thread kuyruğa döner ve boş olan herhangi bir carrier'da devam eder. Modu değiştir ve süreleri karşılaştır.

Pinning

Java 21'de virtual thread synchronized içinde unmount olamaz, çünkü monitor carrier thread'e bağlıdır. Buna pinning denir: bekleme süresince carrier de bekler.

Native method içinde de aynısı olur. -Djdk.tracePinnedThreads=short bu yerleri gösterir.

Java 21'de çözüm ReentrantLock'tur. Java 24'te (JEP 491) synchronized artık pinning oluşturmaz.

Ne zaman yardım etmez

Virtual thread'ler bekleyen işi ucuzlatır, hesaplamayı hızlandırmaz. CPU işi için çekirdek sayısı kadar thread yeterlidir.

Onlar sadece ucuz thread'lerdir. Aynı anda kaç iş yürüyeceğini sınırlamak için pool değil, Semaphore kullanılır.