홈 › 고급 › 02 / 10

멀티스레드와 동기화

섹션 7진행 0 / 10

멀티스레드(Multithreading) — 공유 메모리에서 안전하게 동시성 다루기

스레드가 메모리를 어떻게 공유하는지, 경쟁 조건이 왜 생기는지, synchronized/volatile/Atomic/Lock 이 각각 무엇을 보장하는지 이해하고, ExecutorService 와 JDK 21 가상 스레드로 실무 병렬 처리를 안전하게 작성할 수 있게 됩니다.

1. 왜 배우는가

웹 서버는 요청 하나마다 스레드 하나를 배정합니다. 톰캣 기본 설정은 200개 스레드가 동시에 같은 @Service 빈, 같은 캐시 Map, 같은 커넥션 풀을 건드립니다. "내 코드는 싱글 스레드로 테스트했는데 운영에서만 이상한 값이 나온다"는 문제의 90% 는 이 레슨에서 다루는 경쟁 조건(race condition)입니다. 재현이 안 되고 로그도 없기 때문에 원리를 모르면 며칠을 낭비합니다.

또한 성능 문제의 해결책도 멀티스레드입니다. 외부 API 10개를 순차 호출하면 10초, 병렬로 호출하면 1초입니다. 대용량 파일 100개를 파싱하는 배치, 이미지 리사이징, 대량 이메일 발송 — 모두 ExecutorService 나 가상 스레드로 처리합니다. 하지만 스레드를 잘못 쓰면 데드락으로 서버가 멈추거나, 스레드 풀 고갈로 모든 요청이 타임아웃됩니다.

JDK 21 의 가상 스레드(virtual thread)는 이 분야의 판을 바꿨습니다. 수백만 개의 스레드를 만들 수 있게 되면서 "스레드 풀 크기 튜닝"이라는 오래된 고민이 상당 부분 사라졌습니다. 하지만 가상 스레드도 공유 메모리 문제는 그대로 안고 있으므로, 이 레슨의 원리는 여전히 필수입니다.