Summary
- 자바 플랫폼의 가상 스레드를 소개합니다. 가상 스레드는 높은 처리량을 갖는 동시성 애플리케이션을 작성하고, 유지보수하며 관찰할 때 발생하는 수고들을 획기적으로 줄여주는 경량 스레드입니다.
History
- 가상 스레드는 JEP 425에서 프리뷰 기능으로 제시되었고 JDK 19에서 제공됐습니다. 피드백을 위한 시간을 확보하고 더 많은 경험치를 쌓기 위해서, JEP 436에서 다시 한번 프리뷰 기능으로 제시되어 JDK 20에 공개됐었죠. 이 JEP는 JDK 20에서 한 가지만 추가로 변경하여 JDK 21에서 가상 스레드를 최종적으로 확정할 것을 제시합니다.
- 개발자의 피드백에 따라 변경된 한가지 변경은 가상 스레드가 이젠 스레드 로컬 변수들도 항상 지원한다는 점입니다. 프리뷰 릴리즈에서처럼 스레드 로컬 변수를 제공하지 않는 가상 스레드는 더 이상 생성할 수 없습니다. 스레드 로컬 변수 지원이 보장됨에 따라 더 많은 기존 라이브러리들이 변경 없이 가상 스레드를 사용할 수 있고, 태스크 지향 코드들을 가상 스레드로 마이그레이션할 수 있습니다.
Goals
- 단순한 요청별 스레드(Thread-per-request) 스타일로 작성됐던 서버 어플리케이션을 최적의 하드웨어 활용이 가능하도록 합니다.
- 최소한의 변경으로
java.lang.Thread API를 사용하는 기존 코드가 가상 스레드를 채택할 수 있도록 합니다.
- 기존의 JDK 툴들을 사용해 가상 스레드의 트러블 슈팅, 디버깅, 프로파일링을 손쉽게 할 수 있습니다.
Non-Goals
- 전통적인 스레드들의 구현을 제거하거나 기존 애플리케이션이 큰 변화없이(silently) 가상 스레드를 사용하도록 마이그레이션하는 것은 목표가 아닙니다.
- 자바의 기본적인 동시성 모델을 변경하는 것도 목표가 아닙니다.
- 자바 언어나 라이브러리들에서 새로운 데이터 병렬 처리 구조를 제공하는 것도 목표가 아닙니다. Stream API는 여전히 대규모의 데이터 세트를 병렬로 처리할 때 선호되도록 남아있을 겁니다.
Motivation
- 자바 개발자들은 거의 30년 동안 동시성 서버를 구축하는데 스레드들을 의존해왔습니다. 모든 메서드의 모든 문장은 스레드 내부에서 실행됐고, 자바가 멀티 스레드였기 때문에 한번에 여러 멀티 스레드들의 실행이 일어났죠. 스레드는 자바의 동시성 단위입니다. 다른 스레드들과 동시에 실행되지만 대부분 독립적으로 실행되는 순차적인 코드들의 조각이죠. 각 스레드들은 로컬 변수들을 저장하고 메서드 호출을 협력하기 위한 스택과 뭔가 문제가 생겼을 때의 컨텍스트를 제공합니다. 예외는 동일한 스레드의 메서드에 의해서 발생하고 포착되기 때문에, 개발자들은 스택 트레이스를 사용해 무슨 일이 일어난건지 찾아낼 수 있습니다. 스레드들은 핵심 개념이기도 합니다. 디버거들은 하나의 스레드들 내의 문장들을 단계별로 살펴보고, 프로파일러는 그들의 성능을 이해를 돕기 위해 여러 스레드들의 행동들을 시각화합니다.