동시성문제 Concurrency

이용만·2024년 9월 25일

동시성문제 : 예를들어 여러 스레드가 동시에 데이터를 읽고 쓰려고 할 때

왜 동시성 문제 해결? : 내 생각엔 동시성 문제가 발생되면 DB가 기대한 값과는 다르게 나오고 그 결과 고객의 컴플레인 들어오고 우리 서비스는 사용안하고 매출 하락하고 월급도 못받고.... 그래서 동시성 문제 해결이 필요함.

그러면 자바에서 동시성 문제를 관리하기 위해 어떤 것을 사용하는가?
1) Synchronization
이 녀석을 메소드에 적용을 하면 그 메소드 영역은 하나의 스레드만 실행하게 됨.
그럼 여러 스레드가 들어왔을 때 하나의 스레드만 처리하게 되면 그 뒤에 요청사항은 언제 처리할거야? 대기하고 있겠지? 너무 기다리면 사용자가 지쳐버림.

2) Concurrent Collections <- 고급 동시성 프로그래밍 기법이래. 처음들어봄^^;
이 녀석은 멀티스레드 동시에 데이터 구조에 접근하는 것을 안전하게 만들어준대.
어떻게 그러냐면 이 녀석 내부적으로 세분화된 락 or 락 없는 알고리즘을 사용한대.
다양한 친구들이 있는거 같은데

  • ConCurrentHashMap : 데이터가 빈번하게 변경될 때
  • CopyOnWriteArrayList : 변경이 거의 없는 리스트 구조(읽기 위주)
  • ConcurrentLinkedQueue : 비차단 대기열을 필요로 하는 환경에서 사용.
    *비차단 환경 : 스레드가 작업을 끝날때까지 다른 스레드를 기다리게 하지 않음

3) @Transactional
이 녀석의 특징은 한 작업을 실행할 때 되면 커밋, 안되면 롤백하는 특징임.
@Transactional로 동시성 이슈를 해결할 때 @Transactional 어노테이션의 격리 수준을 높여 동시성 이슈를 해결할 수 있지만 스프링은 READ_COMMITED 격리 수준을 사용해서 다른 쓰레드의 작업을 차단해 동시성을 해결한다고 함.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

포인트를 충전할 때 충전을 갑자기 여러명이 요청해서 다중 스레드가 발생했을 때 동시성 문제와 테스트코드를 작성해야하는데 Concurrent Collections를 사용해보려한다.
왜? 코치님의 힌트를 기억해보면 Synchronization을 사용한다면 다른 스레드가 기다려야 하니 성능 저하가 일어나 비추천한다고 하셨다.

profile
성장하는 개발자가 되고자 합니다.

1개의 댓글

comment-user-thumbnail
2024년 9월 30일

동시성 문제에 대해도 정리해주셨군요..! 과제하며 정리하는게 사실 쉽지 않은데, 고생 많으셨습니다!

답글 달기