-
자바 21 특징 - 가상 쓰레드스터디 노트 2023. 10. 9. 22:34
아래 내용은 다음 영상(https://youtu.be/srpOD6WIasM?si=VUpKeXTwB7-_OFUo)을 요약 정리한 내용입니다.
자바 19에 프리뷰로 추가가 되었으며 자바 21에 정식으로 포함.
가상 쓰레드의 구현 목적
- 요청당 쓰레드 구조의 서버 애플리케이션의 하드웨어 최적 사용
- 최소 변경으로 기존 코드에 가상 쓰레드 적용
// 가상 쓰레드 코드 예 // 01. Thread virtual = Thread.ofVirtual() .name("virtual") .start(() -> { callMethod(); }); virtual.join(); // 02. try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) { ... executor.submit(() -> someCode()); ... }
일반적으로 우리가 사용했던 쓰레드는 플랫폼 쓰레드이며, 플랫폼 쓰레드는 OS쓰레드와 1:1로 매핑이 된다.
하나의 플랫폼 쓰레드가 여러 개의 가상 쓰레드를 실행할 수 있다.
하나의 가상 쓰레드를 여러 플랫폼 쓰레드가 나누어서 실행할 수도 있다.
그래서 플랫폼 쓰레드와 가상 쓰레드의 관계는 M:N관계이다.
여기서 가상 쓰레드를 실행하고 있는 쓰레드를 캐리어 쓰레드라고 부른다.
가상 쓰레드는 IO블로킹이 발생하면 캐리어 쓰레드가 다른 가상 쓰레드를 실행한다.
플랫폼 쓰레드를 블로킹하지 않고, IO 처리가 가능해지면 가상쓰레드를 이어서 실행함.
코드는 동기로 작성되어 있는데, 실제 동작는 비동기처럼 동작함.
성능상 이점은 아래와 같다.
- 스케줄링(컨텍스트 스위칭)부하 : 가상 쓰레드 < 플랫폼 쓰레드
- 메모리 사용 : 가상 쓰레드 < 플랫폼 쓰레드
- IO 블로킹에 따른 대기 시간 낭비 : 가상 쓰레드 < 플랫폼 쓰레드
가상 쓰레드를 사용할 때 주의해야 할 점은 Pinned 현상이다. 가상 쓰레드가 캐리어 쓰레드에 고정되는 상황이 발생할 수 있음.
- synchronized 블록/메서드에서 발생. 이땐 Lock 사용해서 피함.
- 네이티브 메서드 또는 foreign 함수 사용 시 발생
추가적으로 가상 쓰레드는 Threadlocal을 지원하여 기존 도구를 그대로 사용할 수 있음.
다만 가상 쓰레드는 무지 많이 만들 수 있으므로 주의해서 사용해야 함.
가상 쓰레드는 풀링하지말고 필요하면 그냥 생성해서 쓰면 됨.
정리를 하자면, 가상 쓰레드를 사용하면 코드 수정 없이 성능(처리량)을 늘릴 수 있게 되었음.
단, Synchronized 블록에서 IO를 하면 안됨(자바 21 기준).
또 가상 쓰레드는 CPU를 주로 사용하는 작업에는 효과 없음. 주로 네트워크 IO 중심의 작업일 때 효과가 큼.
'스터디 노트' 카테고리의 다른 글
[Java] IntStream 메소드 사용해보기 (0) 2023.10.16 자바 JDK 9 부터 JDK17까지의 주요 코딩 특징 (0) 2023.10.12 [Java] 객체 필드 Validation 손쉽게 구현하기 (feat. Bean Validation & @NotNull) (0) 2023.10.12 자바 21 특징 - SequencedCollection (2) 2023.10.10 자바스크립트 코드 프로처럼 쓰는 팁 (1) 2023.10.08