SW/Java

잠금 해제 성능: Java 21 가상 스레드 탐색

얇은생각 2023. 12. 15. 07:30
반응형

Java 21은 기존 플랫폼 스레드와 함께 효율적인 가상 스레드를 도입하여 성능 이점과 유연성을 제공합니다.

이번 자바 21 튜토리얼에서는 개발자들을 위한 획기적인 기능인 가상 스레드에 대해 알아봅니다. 가상 스레드는 기존 플랫폼 스레드를 대체하는 가볍고 효율적인 대안으로, 동시 프로그래밍을 단순화하고 자바 애플리케이션의 성능을 향상시키도록 설계되었습니다. 이 글에서는 이 강력한 자바 21 기능을 활용하는 데 도움이 되는 가상 스레드의 안팎, 이점, 호환성 및 마이그레이션 경로에 대해 알아보겠습니다.

 

잠금 해제 성능: Java 21 가상 스레드 탐색

 

가상 스레드 소개

자바 플랫폼의 쓰레드 모델에서 가상 쓰레드는 크게 발전했습니다. 이들은 높은 처리량의 동시 애플리케이션 작성, 유지 및 최적화 문제를 해결하기 위해 고안되었습니다. 가상 쓰레드를 기존 플랫폼 쓰레드와 구별하여 이해하는 것이 중요합니다.

기존 자바에서는 java.lang.Thread의 모든 인스턴스가 플랫폼 스레드입니다. 플랫폼 스레드는 기본 OS 스레드에서 Java 코드를 실행하고 실행 기간 동안 해당 OS 스레드를 점유합니다. , 플랫폼 스레드의 수가 사용 가능한 OS 스레드의 수로 제한되어 동시성이 높은 애플리케이션에서 잠재적인 리소스 제약 및 차선의 성능으로 이어짐을 의미합니다.

반면, 가상 스레드는 java.lang.thread의 인스턴스이기도 하지만 서로 다르게 동작합니다. 가상 스레드는 전체 라이프사이클 동안 OS 스레드를 캡처하지 않고 기본 OS 스레드에서 자바 코드를 실행합니다. 이러한 결정적인 차이는 여러 가상 스레드가 동일한 OS 스레드를 공유할 수 있다는 것을 의미하며, 이는 시스템 리소스를 매우 효율적으로 활용할 수 있는 방법을 제공합니다. 플랫폼 스레드와 달리 가상 스레드는 소중한 OS 스레드를 독점하지 않으므로 사용 가능한 OS 스레드 수보다 훨씬 더 많은 수의 가상 스레드를 생성할 수 있습니다.

 

가상 스레드의 루트

가상 스레드는 사용자 모드 스레드에서 영감을 끌어내며, Go(고루틴 포함) Erlang(프로세스 포함)과 같은 다른 다중 스레드 언어에서 성공적으로 사용되었습니다. 자바 초기에는 사용자 모드 스레드가 OS 스레드에 대한 미성숙 및 제한된 지원으로 인해 "녹색 스레드"로 구현되었습니다. 이러한 녹색 스레드는 결국 1:1 스케줄링 모델에서 운영되는 OS 스레드의 포장지인 플랫폼 스레드로 대체되었습니다.

가상 스레드는 M:N 스케줄링 모델을 사용하여 보다 정교한 접근 방식을 취합니다. 이 모델에서는 많은 가상 스레드(M)가 더 적은 OS 스레드(N)에서 실행되도록 스케줄링됩니다. 이러한 M:N 스케줄링 접근 방식을 통해 자바 애플리케이션은 일반적으로 플랫폼 스레드와 관련된 자원 제약 없이 높은 동시성 수준을 달성할 수 있습니다.

 

가상 스레드 활용

자바 21에서 개발자들은 가상 스레드의 힘을 쉽게 활용할 수 있습니다. 가상 및 플랫폼 스레드를 생성하기 위해 새로운 스레드 빌더가 도입되어 스레드화 모델에 대한 유연성과 제어 기능을 제공합니다.

가상 스레드를 생성하려면 다음 코드 스니펫을 사용할 수 있습니다:

Thread.Builder builder = Thread.ofVirtual().name("Virtual Thread");
Runnable task = () -> System.out.println("Hello World");
Thread thread = builder.start(task);
System.out.println(thread.getName());
thread.join();

 

 

가상 스레드는 플랫폼 스레드와 비교할 때 리소스 사용량 측면에서 상당히 저렴하다는 점에 유의해야 합니다. 여러 개의 가상 스레드를 생성할 수 있으므로 이 새로운 스레드 모델의 이점을 충분히 활용할 수 있습니다:

Thread.Builder builder = Thread.ofVirtual().name("Virtual Thread", 0);
Runnable task = () -> System.println("Hello World: " + Thread.currentThread().threadId());

Thread thread1 = builder.start(task);
Thread thread2 = builder.start(task);
thread1.join();
thread2.join();

  

 

가상 스레드는 아래 코드에 나와 있는 것처럼 ExecutorService를 통해 효과적으로 활용할 수도 있습니다:

try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
    Future<String> future = executor.submit(() -> "Hello World");
    System.out.println(future.get());
    System.println("The end!");
}

 

 

가상 대 플랫폼 스레드 트레이드오프

자바 21에서는 플랫폼 스레드가 사용되지 않으며, 가상 스레드가 천편일률적인 해결책이 아니라는 점을 이해하는 것이 중요합니다. 스레드의 각 유형에는 고유한 트레이드오프 세트가 있으며, 애플리케이션의 특정 요구 사항에 따라 이들 중에서 선택해야 합니다.

가상 스레드: 가상 스레드는 처리량이 많은 동시 작업, 특히 OS 스레드 제한 없이 많은 가벼운 스레드를 관리할 때 탁월합니다. I/O 바인딩 작업, 이벤트 기반 작업 및 수명이 짧은 스레드가 많은 워크로드에 적합합니다.

플랫폼 스레드: 플랫폼 스레드는 스레드 상호 작용에 대한 세밀한 제어가 필수적인 애플리케이션에 여전히 유용합니다. CPU 바인딩 작업, 실시간 애플리케이션 및 정확한 스레드 관리가 필요한 시나리오에 이상적입니다.

결론적으로 자바 21의 가상 스레드는 자바 플랫폼에 획기적으로 추가된 것으로 개발자들에게 동시성을 보다 효율적이고 확장적으로 처리할 수 있는 방법을 제공합니다. 가상 스레드와 플랫폼 스레드 간의 차이점과 트레이드오프를 이해함으로써 이러한 강력한 기능을 언제 어떻게 활용하여 자바 애플리케이션의 잠재력을 최대한 활용할 수 있는지에 대한 정보에 입각한 의사결정을 내릴 수 있습니다.

반응형