본문 바로가기
IT/Java

CountDownLatch (다른 쓰레드 대기)

by 성준하이 2023. 10. 13.
반응형

이전 포스팅에서 Thread 간에 동시성 이슈에 대해 다룬 글이 있다.

자세한 내용은 참고 포스팅 참고 바란다.

 

Thread 를 생성해서 사용할때 별도의 쓰레드 공간을 만들어서 사용하기 위해서는 아래 참고포스팅에있는 threadLocal을 사용하는 방식도 있지만 CountDownLatch 를 사용하는 방법도 있다.

 

예시 코드로 바로 설명하면

private CountDownLatch countDownLatch = new CountDownLatch(5);
private Thread1 thread1;
private Thread2 thread2;

@GetMapping("/threadtest")
public void threadStart() {
     thread1 = new Thread1();
     thread1.start();
     thread2 = new Thread2();
     thread2.start();
}


private class Thread1 extends Thread {
     @Override
     public void run() {
         System.out.println("Thread1 start");
         try {
             // 5초 후 countDown() 호출
             Thread.sleep(5000);
             System.out.println("5초 지났음.");
             countDownLatch.countDown();
         } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
}


private class Thread2 extends Thread {
     @Override
     public void run() {
         System.out.println("Thread2 start");
         try {
             countDownLatch.await();
             System.out.println("await end");
         } catch (InterruptedException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
     }
}

일단 위와 같이 클래스 상단에 전역 변수로 CountDownLatch 를 5로 설정을 해두었다.

그리고 main에서는 thread1 과 thread2 를 호출하였고,

 

출력 결과
  • 만약 countdownLatch가 없었다면
    핑크색 라인인 print 가
    thread1 start -> thread2 start -> await end -> (5초뒤) 5초 지났음
    이 출력이 될것이다.
  • 하지만 countDownLatch의 설정에 따라
    1번 호출하면 5초가 지난후 count 가 5에서 4로 내려가고
    출력은
    1번째 호출때 thread1 start -> thread2 start -> (5초뒤) 5초 지났음
    2번째 호출때 thread1 start -> thread2 start -> (5초뒤) 5초 지났음
    3번째 호출때 thread1 start -> thread2 start -> (5초뒤) 5초 지났음
    4번째 호출때 thread1 start -> thread2 start -> (5초뒤) 5초 지났음
    5번째 호출때 thread1 start -> thread2 start -> (5초뒤) 5초 지났음 -> 
                        await end ->await end ->await end ->await end ->await end

이렇게 5번이 한번에 몰아서 호출이 되게 된다.

 

동시성 이슈를 해결할수 있는 또다른 방법중 하나이지만 여러개의 동시에 호출이 많이 들어올 경우에는 count 수를 잘 고려해야한다.


참고 포스팅

https://thenicesj.tistory.com/717

 

ThreadLocal (동시성문제) 사용법 및 주의사항

이전 포스팅에서 Thread 사용법에 대해서 다룬적이 있다. 자세한 내용은 아래 참고 포스팅 참고 바란다. 하지만 대량 트래픽이 존재하는 서비스에서 매번 발생하는 문제. 바로 동시성 이슈 이다.

thenicesj.tistory.com

 

반응형

댓글