이 글은 인프런 '재고시스템으로 알아보는 동시성이슈 해결방법' 강의를 듣고 작성한 글입니다.
현재 위치 : 6강
테스트 작성 시 multi thread로 동시에 일어나는 일을 가정한다.
멀티 스레드란?
정의 : 프로세스 내에서 실행되는 흐름의 단위. 여기서는 하나의 프로그램 내에서 실행되는 처리 단위를 뜻하며, 멀티 스레드란 동시에 여러 요청을 처리하는 기능.
스프링에서는?
내장된 was 톰 캣이 thread pool 관리를 하여 여러 요청이 들어오면 자동으로 멀티 스레드로 처리한다.
다뤄봤던 스레드 예제
방법 1. execute(()->{}) 로 직접 함수 작성 및 실행
방법 2. implements Runnable, submit() 으로 custom 실행 객체 작성 및 실행
예제 :
@Test
void multiThreads() throws InterruptedException {
// thread 사용할 수 있는 서비스 선언, 몇 개의 스레드 사용할건지 지정
ExecutorService executorService = Executors.newFixedThreadPool(2);
// 다른 스레드 작업 완료까지 기다리게 해주는 클래스
// 몇을 카운트할지 지정
// countDown()을 통해 0까지 세어야 await()하던 thread가 다시 실행됨
CountDownLatch latch = new CountDownLatch (2);
// thread 실행
// 보통 for문안에서 여러번 같은 코드를 실행시킴
executorService.execute(() -> {
// thread가 실행할 작업 코드 ...
// CountDownLatch의 카운트 감소
latch.countDown();
// count가 0이 될 때까지 대기
latch.await();
});
// 또는 executorService에 Runnable을 상속받은 클래스를 직접 submit할 수도 있음.
executorService.submit(new CustomRunnable());
}
CustomRunnable.java
// Runnable 클래스 상속
public class CustomRunnable implements Runnable {
public CustomRunnable() {}
// 어떤 일을 실행할건지 override 필요
@Override
public void run() {
// 뭔가 실행할 내용
}
}
CountDownLath : https://1minute-before6pm.tistory.com/30