Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Spring Boot 4.0
- spring boot 4.0.0
- zipkin
- Java
- 디자인패턴
- spring batch
- 디자인 패턴
- 스프링 배치
- 스레드
- saga pattern
- 사가 패턴
- Spring Boot Actuator
- 타입스크립트
- spring boot
- spring cloud
- 알고리즘
- TypeScript
- Resilinece4j
- java 정렬
- JPA
- 멀티스레드
- thread
- 배치
- Spring Cloud Netfilx Eureka
- 생산자 소비자 패턴
- 키클락
- MSA
- spring boot 3.x.x
- spring boot 4.x.x
- java21
Archives
- Today
- Total
PSD( Private-Self-Development )
JAVA 21 변경점 본문
JAVA 21은 가장 중요한 성능에 큰 개선이 이루어진 아주 중요한 버전이다.
1. Virtual Threads
java 21 의 알파이자 오메가
기존
- 자바 스레드 1개 = OS 스레드 1개
- 생성 비용이 비싸고 개수 제한이 있음
- IO작업(DB, 네트워크) 을 대기 시 스레드가 멈춤 (블로킹)
Virtual Threads
- 자바 스레드 N개 = OS 스레드 1개
- 생성 비용이 거의 없음, 개수 제한 없음
- IO작업(DB, 네트워크) 을 대기 시 즉시 다른 가상 스레드가 OS 스레드 점유 (논블로킹)
- 주의! 가상스레드가 블로킹 되는 경우가 있는데 synchronized 블록안에 있으면 블로킹되어 버림
사용하는 대부분 라이브러리에서 synchronized 를 걷어내는 처리가 되었지만 최신버전으로 유지해야함
// 기존
ExecutorService executor = Executors.newFixedThreadPool(200);
// 가상 스레드 방식
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 100_000).forEach(i -> {
executor.submit(() -> {
Thread.sleep(1000); // 이때 대기하지 않고 다른일 시작
return i;
});
});
}
2. 순서가 있는 컬렉션의 통합
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
// 기존
String first = list.get(0);
String last = list.get(list.size() - 1);
// Java 21
String first = list.getFirst();
String last = list.getLast();
list.addFirst("Start"); // 앞에 추가
list.addLast("End"); // 뒤에 추가
List<String> reversed = list.reversed(); // 역순 변환
3. instanceof 의 record 내부 변수 자동 분해 지원
// 기존
if (obj instanceof Point p) {
int x = p.x(); // getter 호출 필요
int y = p.y();
}
// Java 21 (내부 값까지 바로 분해)
if (obj instanceof Point(int x, int y)) {
System.out.println(x + ", " + y);
}
4. Switch 문에서 null 값 분기로 사용 가능
String result = switch (obj) {
case Integer i -> String.format("숫자입니다: %d", i);
case String s -> "문자열입니다: " + s;
case null -> "널입니다!"; // 드디어 null case 지원! (NPE 방지)
default -> "모르는 타입";
};
'Backend > JAVA' 카테고리의 다른 글
| JAVA 17 변경점 (0) | 2026.01.27 |
|---|---|
| JAVA 11 변경점 (0) | 2026.01.27 |
| JAVA 8 변경점 (0) | 2026.01.27 |
| 가비지 컬렉션(Garbage Collection) (0) | 2023.07.12 |
| 생성자 주입을 사용하는 이유 (0) | 2023.01.30 |