Java ‐ Virtual Thread - woojin-playground/Backend-PlayGround GitHub Wiki
Virtual Thread Example Code
public static void main(String[] args) throws InterruptedException {
ThreadFactory factory = Thread.ofVirtual().name("test-", 0).factory();
try (ExecutorService executorService = Executors.newThreadPerTaskExecutor(factory)) {
for (int i = 0; i < 100; i++) {
executorService.submit(runnable);
}
}
}
newThreadPerTaskExecutor: 작업 1개 = 가상 스레드 1개, 풀 관리에 대한 고민이 없다.try-with-resources: 자원 관리가 깔끔하다.- 가상 스레드 : 생성 비용 거의 없다, 블로킹 I/O에 매우 강하다.(DB, HTTP, sleep 등)
Virtual Thread 개념
가상 쓰레드에서 고정(pinning) 현상을 유발하며 성능 저하를 일으킬 수 있는 주된 원인 - synchronized 블록 안에서의 블로킹 작업
synchronized블록이나 네이티브 메서드 안에서 쓰레드가 블로킹 상태가 되면 가상 쓰레드가 플랫폼 쓰레드에서 언마운트되지 못하고 고정되어 비효율적이 된다.- 이런 문제를 해결하려면
ReentrantLock으로 동기화 방식을 바꿔주면 블로킹 시 가상 쓰레드가 플랫폼 쓰레드에서 분리될 수 있어 고정 문제를 피하고 성능을 개선할 수 있다.
SpringBoot에서의 Virtual Thread
spring:
threads:
virtual:
enabled: true
참고한 문서 정리