Java 21 virtual thread'ler nedir? Platform thread'lerden farkı nedir ve hangi durumlarda dikkatli olmak gerekir?

Cevap

Virtual thread'ler (Project Loom, Java 21'de final), JVM tarafından yönetilen çok hafif thread'lerdir. Bir OS thread'ine bire bir bağlı değildirler; az sayıda carrier (platform) thread üzerinde çalışırlar. Bloklayan bir I/O çağrısında virtual thread carrier'dan ayrılır (unmount) ve carrier başka bir işe geçer.

Platform threadVirtual thread
Eşleme1 Java thread = 1 OS threadÇok sayıda virtual thread, az carrier
BellekYaklaşık 1 MB stack rezerviBirkaç KB, heap'te büyür
SayıBinlerMilyonlar
Uygun işCPU-boundBloklayan I/O (DB, HTTP)
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    for (int i = 0; i < 10_000; i++) {
        executor.submit(() -> httpClient.send(request, ofString()));
    }
}

Spring Boot 3.2+ ile spring.threads.virtual.enabled=true ayarı Tomcat isteklerini ve @Async görevlerini virtual thread'lerde çalıştırır.

Faydası

Reactive programlamanın (WebFlux) karmaşıklığına girmeden, klasik bloklayan "thread-per-request" koduyla yüksek eşzamanlılık elde edilir.

Dikkat edilmesi gerekenler

  • Pinning: Java 21-23'te synchronized blok içinde bloklayan çağrı virtual thread'i carrier'a sabitler; ölçeklenme kaybolur. Bu sorun Java 24 (JEP 491) ile büyük ölçüde giderildi. Eski sürümlerde ReentrantLock kullanın.
  • Pool'lamayın: virtual thread'ler ucuzdur, her görev için yenisi açılır.
  • Downstream limitleri hâlâ geçerli: 10.000 virtual thread aynı anda DB'ye gitmeye çalışırsa connection pool (ör. HikariCP 10 bağlantı) darboğaz olur. Eşzamanlılığı Semaphore ile sınırlayın.
  • ThreadLocal ile büyük nesne cache'lemek milyonlarca thread'de bellek patlatır; Java 25'te final olan ScopedValue daha uygundur.
  • CPU-bound işte fayda sağlamaz.
  1. ExecutorService ve CompletableFuture ile asenkron iş nasıl yapılır? Thread pool boyutunu nasıl belirlersiniz?OrtaJava & SpringBackend
  2. JPA/Hibernate'te lazy ve eager loading farkı nedir? LazyInitializationException neden oluşur ve nasıl çözülür?OrtaJava & SpringBackend
  3. @Transactional anotasyonu hangi durumlarda çalışmaz? Self-invocation, rollback kuralları ve propagation tuzaklarını açıklayın.ZorJava & SpringBackend
  4. Spring bean scope'ları nelerdir? Singleton bir bean'e prototype bean inject edilirse ne olur?KolayJava & SpringBackend
  5. Spring'de Dependency Injection nedir? Constructor injection neden field injection'a tercih edilir?KolayJava & SpringBackend
  6. Java'da Garbage Collection nasıl çalışır? G1 ve ZGC arasındaki farklar nelerdir, hangisini ne zaman seçersiniz?ZorJava & SpringBackend

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle