[JAVA] 21보다는 25를 써야하는 이유
서버의 아웃바운드 공인 IP 를 조회해서 캐싱해두는 간단한 컴포넌트가 있었습니다.캐시가 만료되면 외부 엔드포인트를 호출해서 IP 를 다시 받아오고, TTL 만큼 다시 캐싱하는 구조입니다.이때 캐시가 만료된 순간 여러 스레드가 동시에 들어와서 외부 호출을 중복으로 날리는 것을 막기 위해 synchronized 블록으로 한 스레드만 갱신하도록 막아두었습니다.흔히 쓰는 single-flight 패턴입니다. 문제는 이 애플리케이션이 가상 스레드(Virtual Thread) 위에서 돌고 있었고, JDK 버전이 21 이었다는 점입니다.synchronized 블록 안에 블로킹 HTTP I/O 가 들어 있었기 때문에, 이 코드는 JDK 21 에서 캐리어 스레드를 pinning 하는 코드였습니다. 이번 포스팅에서는 왜 ..