개발 관련 부가 지식/자바, 스프링
멀티쓰레드 Test code 작성 및 동기화 방법
Developer-Choi
2023. 1. 9. 14:20
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 사용