Coroutine과 Virtual Thread

Rookedsysc·2025년 2월 26일

JVM

목록 보기
3/3
post-thumbnail

🎯 요약

코루틴(Coroutine)Virtual Thread
스레드 모델기존 스레드 풀에서 코루틴을 실행새로운 사용자 모드 스레드
멀티태스킹 방식협력적 (중단된 Coroutine을 다른 스레드에서 실행 가능)선점형(Preemptive)
중단 방식suspend 키워드로 명시적으로 중단I/O 블로킹 시 자동으로 suspend & resume
메모리 사용량매우 적음(스택 저장 방식)기존 OS 스레드보다 적지만, 코루틴보다는 큼
컨텍스트 스위칭 비용매우 낮음(둘 다 커널모드 전환이 일어나지 않고 힙에 저장하는 방식)낮지만, 코루틴보다는 높음
스케줄링 방식스케줄링 방식OS 스레드 기반의 ForkJoinPool 활용
선택 기준CPU 바운드 작업 (계산량 많음)I/O 바운드 (네트워크, 파일)
사용 용도비동기 UI 렌더링멀티스레딩이 필요한 대규모 I/O 바운드 작업

Coroutine의 Suspend

suspend keyword를 사용하면 메서드 호출시 기본 스레드가 차단되지 않는다.

interface GitHubService {
    @GET("orgs/{org}/repos?per_page=100")
    suspend fun getOrgRepos(
        @Path("org") org: String
    ): List<Repo>
}

Coroutine에서 동시성 문제를 해결하는 방법

  • AtomicInteger 등 원자적 연산을 제공하는 자료형 사용
  • Mutex 사용

Virtual Thread에서 suspend가 되지 않는 경우

  • Native 코드에서 Block이 발생하는 경우 (JVM에서 제어권이 넘어갔기 때문)
  • Synchronized Block을 사용하는 경우 (Class 단위로 Block 하기 때문) 👉 ReentrantLock 사용 필요

※ 참조

2개의 댓글

comment-user-thumbnail
2025년 3월 11일

코루틴이 CPU 바운드 작업에 적합하다는 설명은 Dispatchers.Default 기준일까요?
본문에 없는 내용 중 중요한 점이 하나 있는데 코루틴은 suspend가 전파되기 때문에 함수 색상 문제를 가진다는 점도 유의해야합니다.
추가로 virtual thread를 사용하는 custom dispatcher를 정의하면 코루틴 자체가 vt에서 동작하도록 처리할 수도 있습니다.

1개의 답글