본문 바로가기

개발 관련 부가 지식/자바, 스프링

멀티쓰레드 Test code 작성 및 동기화 방법

728x90
728x90

동시성 공부 중, 테스트코드를 작성하면서 새로 사용한 java 라이브러리 정리✨ !!

1. 멀티쓰레드를 구현해주는 ExecutorService 

code -> ExecutorService executorService = Executors.newFixedThreadPool(int Threads);

(FixedThreadPool은 고정된 개수를 가진 쓰레드풀이다)


2. 다른 스래드에서 수행중인 작업을 완료될때까지 대기하도록 도와주는 CountDownLatch 

CountDownLatch latch = new CountDownLatch(threadCount);





사용 예제


@Test
public void 동시_80개의_요청() throws InterruptedException {

    int threadCount = 80;
    //비동기로 실행되는 작업을 단순화해서 사용하게 도와주는 자바의 api
    ExecutorService executorService = Executors.newFixedThreadPool(32);

    //카운트다운래치는 다른 스래드에서 수행중인 작업을 완료될때까지 대기하도록 도와주는 클래스
    CountDownLatch latch = new CountDownLatch(threadCount);

    for (int i = 0; i < threadCount; i++) {
        executorService.submit(() -> {
            try {
                //수행할 작업(메소드) 여기
            } finally {
                latch.countDown();
            }
        });
    }
    latch.await();

	//검증 프로세스 진행~~
    assertEquals(예상,실제);

 

동기화 방법들에 대해서 ✨ !!

 

1. JAVA 라이브러리 synchronized 사용

메소드(static 메소드도 가능), 변수에 사용가능하며, 한 쓰레드만 접근가능하게 만듬

적용 예제
-> public synchronized void increase() {}

주의점!
위와 같이 일반 메소드에 적용할 시 synchronized 는 인스턴스 단위로 동기화뙘
서버가 여러 개일 경우는 동기화가 되지 못함!!

2. mysql database lock 사용

2-1 pessimistic lock
디비에서 제공하는 락을 사용하여 다른 서버(스레드)의 데이터 접근을 막는 방법

2-2 Optimistic lock
락을 사용하는 것이 아닌, 데이터의 버전을 체크하여 데이터 정합성을 맞추는 방법
DB에서 데이터의 변경에 따라 버전을 관리하여, 최신 버전이 아닐 경우 진행하지않음

2-3 Named lock
pessimistic lock과 비슷하며, row 또는 테이블 단위로 락킹하는 pessimistic와는 달리
메타데이터에 locking을 거는 방법

3. redis database lock 사용

3-1 Lettuce
Spring Data redis를 사용한다면 별도의 라이브러리를 추가하지 않고 사용가능,
스핀락 방식 직접구현해야하고, 레디스 서버에 부하가 심할 수 있음

3-2 Redisson
라이브러리 추가 필요, pub-sub 방식으로 부하가 덜함, 락 획득 재시도 기본으로 제공

재시도가 필요하지 않은 경우는  lettuce 사용, 재시도가 필요하면 redisson 사용