{"id":13,"date":"2026-09-23T20:39:12","date_gmt":"2026-09-23T20:39:12","guid":{"rendered":"https:\/\/www.akifsen.com.tr\/blog\/?p=13"},"modified":"2026-09-23T20:39:13","modified_gmt":"2026-09-23T20:39:13","slug":"java-virtual-threads-spring-boot","status":"publish","type":"post","link":"https:\/\/www.akifsen.com.tr\/blog\/2026\/09\/23\/java-virtual-threads-spring-boot\/","title":{"rendered":"Java Virtual Threads: Daha Fazla Thread De\u011fil, Farkl\u0131 Bir Concurrency Modeli"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Java d\u00fcnyas\u0131nda y\u0131llarca thread say\u0131s\u0131 pahal\u0131 bir kaynak olarak d\u00fc\u015f\u00fcn\u00fcld\u00fc.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu nedenle thread pool boyutlar\u0131, queue capacity ve executor tuning backend geli\u015ftirmede \u00f6nemli optimizasyon alanlar\u0131ndan biri haline geldi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Project Loom ile gelen Virtual Threads bu varsay\u0131m\u0131 ciddi bi\u00e7imde de\u011fi\u015ftirdi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Virtual Threads, Java 21 ile JEP 444 kapsam\u0131nda kal\u0131c\u0131 \u00f6zellik haline geldi. OpenJDK&#8217;nin amac\u0131 \u00f6zellikle thread-per-request modelini korurken I\/O yo\u011fun uygulamalarda y\u00fcksek concurrency sa\u011flayabilmek.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ancak burada kritik bir yanl\u0131\u015f anla\u015f\u0131lma var.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Virtual Thread uygulaman\u0131z\u0131 otomatik olarak daha h\u0131zl\u0131 yapmaz.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Throughput ile execution speed ayn\u0131 \u015fey de\u011fildir<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bir HTTP iste\u011finin 200 ms s\u00fcren database sorgusu yapt\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnelim.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Platform thread modelinde bu 200 ms boyunca bir OS thread bloklanabilir. Ayn\u0131 anda binlerce request geldi\u011finde thread say\u0131s\u0131 problem olmaya ba\u015flar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Virtual Thread ise blocking I\/O s\u0131ras\u0131nda carrier thread&#8217;i b\u0131rakabilir ve JVM ayn\u0131 underlying thread \u00fczerinde ba\u015fka bir i\u015fi \u00e7al\u0131\u015ft\u0131rabilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sonu\u00e7 tek bir request&#8217;in daha h\u0131zl\u0131 bitmesi de\u011fildir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Daha fazla request&#8217;in ayn\u0131 anda bekleyebilmesidir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu nedenle Virtual Threads \u00f6zellikle I\/O-bound sistemlerde anlaml\u0131d\u0131r.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">CPU-bound workload&#8217;da ise fizik de\u011fi\u015fmez. Sekiz core \u00fczerinde ayn\u0131 anda on bin CPU-intensive hesaplama \u00e7al\u0131\u015ft\u0131rman\u0131n yolu Virtual Threads de\u011fildir.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Spring Boot taraf\u0131<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">G\u00fcncel Spring Boot dok\u00fcmantasyonunda Virtual Threads \u015fu property ile a\u00e7\u0131labiliyor:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spring.threads.virtual.enabled=true<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Spring dok\u00fcmantasyonu Java 21 veya \u00fczerini gerektiriyor ve g\u00fcncel s\u00fcr\u00fcmlerde Java 24+ kullan\u0131m\u0131n\u0131 en iyi deneyim i\u00e7in \u00f6neriyor. Ayn\u0131 dok\u00fcmantasyon pinned virtual thread durumlar\u0131n\u0131n throughput&#8217;u d\u00fc\u015f\u00fcrebilece\u011fi konusunda da uyar\u0131yor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bunun yan\u0131nda \u00f6nemli bir ayr\u0131nt\u0131 daha var.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Virtual Threads kullanmaya ba\u015flad\u0131\u011f\u0131n\u0131zda baz\u0131 klasik thread-pool tuning ayarlar\u0131 anlam\u0131n\u0131 kaybeder. Spring&#8217;in g\u00fcncel dok\u00fcmantasyonu virtual threads aktifken ilgili executor&#8217;\u0131n thread pool yerine virtual-thread tabanl\u0131 \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 belirtiyor.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Database connection pool h\u00e2l\u00e2 var<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Virtual Threads&#8217;in s\u0131k yap\u0131lan yanl\u0131\u015f kullan\u0131m \u00f6rne\u011fi burada ortaya \u00e7\u0131k\u0131yor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Art\u0131k 20.000 concurrent request kabul edebiliyor olman\u0131z PostgreSQL&#8217;in 20.000 e\u015f zamanl\u0131 connection kald\u0131raca\u011f\u0131 anlam\u0131na gelmez.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00d6rne\u011fin HikariCP:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>20.000 Virtual Thread\n        \u2193\n50 Database Connection\n        \u2193\nPostgreSQL<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u015feklinde \u00e7al\u0131\u015fmaya devam eder.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yani bottleneck ortadan kalkmaz. Sadece ba\u015fka bir noktaya ta\u015f\u0131nabilir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu k\u00f6t\u00fc bir \u015fey de\u011fildir. Connection pool burada do\u011fal bir backpressure mekanizmas\u0131 g\u00f6revi g\u00f6r\u00fcr.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Eski al\u0131\u015fkanl\u0131klar\u0131 ta\u015f\u0131may\u0131n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OpenJDK dok\u00fcmantasyonundaki \u00f6nemli \u00f6nerilerden biri Virtual Threads&#8217;in pool edilmemesidir. \u00c7\u00fcnk\u00fc bunlar zaten ucuz ve k\u0131sa \u00f6m\u00fcrl\u00fc olacak \u015fekilde tasarlanm\u0131\u015ft\u0131r.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Platform thread d\u00fcnyas\u0131ndaki:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>200 request\n\u2192 20 thread pool\n\u2192 queue<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">modelini d\u00fc\u015f\u00fcnmeden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>task\n\u2192 one virtual thread<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">yakla\u015f\u0131m\u0131na ge\u00e7ebilirsiniz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Virtual Threads Java concurrency&#8217;sini ortadan kald\u0131rmad\u0131.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ama uzun y\u0131llard\u0131r concurrency y\u00fcz\u00fcnden uygulad\u0131\u011f\u0131m\u0131z baz\u0131 savunma mekanizmalar\u0131n\u0131 art\u0131k yeniden de\u011ferlendirmemiz gerekiyor.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">En do\u011fru kullan\u0131m bi\u00e7imi de benchmark&#8217;t\u0131r.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Property&#8217;yi a\u00e7mak de\u011fil.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Java d\u00fcnyas\u0131nda y\u0131llarca thread say\u0131s\u0131 pahal\u0131 bir kaynak olarak d\u00fc\u015f\u00fcn\u00fcld\u00fc. Bu nedenle thread pool boyutlar\u0131, queue capacity ve executor tuning backend geli\u015ftirmede \u00f6nemli optimizasyon alanlar\u0131ndan biri haline geldi. Project Loom ile gelen Virtual Threads bu varsay\u0131m\u0131 ciddi bi\u00e7imde de\u011fi\u015ftirdi. Virtual Threads, Java 21 ile JEP 444 kapsam\u0131nda kal\u0131c\u0131 \u00f6zellik haline geldi. OpenJDK&#8217;nin amac\u0131 \u00f6zellikle thread-per-request [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-13","post","type-post","status-publish","format-standard","hentry","category-mimari"],"_links":{"self":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts\/13","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/comments?post=13"}],"version-history":[{"count":1,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts\/13\/revisions"}],"predecessor-version":[{"id":14,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/posts\/13\/revisions\/14"}],"wp:attachment":[{"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/media?parent=13"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/categories?post=13"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.akifsen.com.tr\/blog\/wp-json\/wp\/v2\/tags?post=13"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}