Engineering Note

[Java] 동시성 제어테스트를 위한 멀티쓰레드 코드 흐름 파악하기 본문

Programming Language/Java

[Java] 동시성 제어테스트를 위한 멀티쓰레드 코드 흐름 파악하기

Software Engineer Kim 2026. 1. 24. 23:11

 

동시성 제어테스트를 위한 멀티쓰레드 코드 흐름 파악하기

private int 주문_동시요청(int 요청개수) throws InterruptedException {
    ExecutorService executor = Executors.newFixedThreadPool(10);
    CountDownLatch latch = new CountDownLatch(요청개수);
    AtomicInteger exceptionCount = new AtomicInteger(0);

    for (int i = 0; i < 요청개수; i++) {
        executor.submit(() -> {
            try {
                orderService.placeOrder(userId, productId, 1);
            } catch (OutOfStockException e) {
                e.printStackTrace();
                exceptionCount.incrementAndGet(); // 재고 부족 예외 카운트
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                latch.countDown();
            }
        });
    }

    latch.await();
    executor.shutdown();
    return exceptionCount.get();
}

 

 

 

Main Thread
     │
     ├─► submit() → Worker1 생성 (작업 던짐)
     ├─► submit() → Worker2 생성 (작업 던짐)
     ├─► submit() → Worker3 생성 (작업 던짐)
     ├─► submit() → Worker4 생성 (작업 던짐)
     ├─► submit() → Worker5 생성 (작업 던짐)
     │
     ├─► latch.await()  ← 여기서 멈춤
     │         │
     │         │   Worker들이 각자 placeOrder() 실행 중...
     │         │   완료될 때마다 countDown() 호출
     │         │
     │         └─► 카운터 0 되면 해제
     │
     ├─► shutdown()
     └─► return

 

 

주요 클래스 요약

 

클래스 패키지 용도
ExecutorService java.util.concurrent 스레드 풀 관리
CountDownLatch java.util.concurrent 동기화 (완료 대기)
AtomicInteger java.util.concurrent.atomic Thread-safe 카운터
Comments