멀티스레딩 환경에서 발생할 수 있는 문제점에는 어떤 것이 있으며, 이를 해결하기 위한 방법은 무엇인지 설명해 주세요.

면접용 답변

멀티스레딩 환경에서는 여러 스레드가 동시에 자원에 접근하면서 데드락, 레이스 컨디션과 같은 문제가 발생할 수 있습니다. 대표적으로 레이스 컨디션은 두 개 이상의 스레드가 공유 자원에 동시에 접근해 실행 순서에 따라 결과가 달라지는 문제고, 데드락은 서로 자원을 점유한 채 상호 대기 상태에 빠지는 현상입니다. 이러한 문제를 해결하기 위해서는 동기화가 중요합니다. Java에서는 synchronized, Lock 등을 사용해 임계 영역을 보호하고, volatile 키워드를 통해 스레드 간의 데이터 일관성을 확보할 수 있습니다.

개념 정리

멀티스레딩의 정의

  • 하나의 프로세스 내에서 여러 스레드가 동시에 작업을 수행할 수 있도록 하는 기술로, 각 스레드는 프로세스의 자원을 공유하면서, 독립적으로 실행되는 흐름을 가짐

  • 주로 서버나 병렬 처리 환경에서 성능 향상과 자원 효율성을 위해 사용

멀티스레딩 환경에서 발생할 수 있는 문제점과 해결 방법

문제점
설명
해결 방법

레이스 컨디션 (Race Condition)

여러 스레드가 동시에 공유 자원에 접근해 실행 순서에 따라 결과가 달라지는 문제

synchronized, Lock, Atomic 변수, 스레드 안전한 자료구조 사용

데드락 (Deadlock)

서로 자원을 점유한 채 다른 프로세스나 스레드가 점유한 자원을 기다리며 무한 대기 상태에 빠지는 문제

자원 접근 순서 통일, 락 최소화, tryLock 사용, 타임아웃 설정

Starvation

우선순위가 낮은 스레드가 자원 접근에서 계속 밀려 실행되지 못하는 문제

Fair Lock 적용, 우선순위 조정

라이브락 (Livelock)

스레드들이 서로 실행을 양보하다가 아무 작업도 하지 못하는 상태

재시도 횟수 제한, 지수 Backoff 전략 적용

데이터 불일치

동기화되지 않은 접근으로 인해 잘못된 데이터 상태가 발생하는 문제

synchronized, Atomic 변수, volatile 키워드, 일관된 동기화 정책 적용

레이스 컨디션 (Race Condition)

  • 둘 이상의 스레드가 동시에 같은 자원에 접근하고, 그 결과가 스레드 실행 순서에 따라 달라지는 문제

  • 해결 방법

    • synchronized 키워드로 임계 영역 보호

    • Lock, ReentrantLock으로 정교한 락 제어

    • AtomicInteger, AtomicLong 등의 Atomic 변수 사용

    • ConcurrentHashMap 등의 스레드 안전한 자료구조 사용

  • Java 예시코드

데드락 (Deadlock)

  • 두 스레드가 서로가 점유한 자원을 기다리며 무한 대기 상태에 빠지는 문제

  • 해결 방법

    • 자원 접근 순서 통일

    • 락 최소화

    • tryLock()과 타임아웃 활용

  • Java 예시

Starvation (기아 상태)

  • 낮은 우선순위의 스레드가 자원 접근에서 밀려 계속 대기만 하게 되는 문제

  • 해결 방법

    • ReentrantLock(true)로 공정성(Fairness) 옵션 적용

    • 스레드 우선순위 적절히 조정

라이브락 (Livelock)

  • 서로 양보하다가 작업이 계속 재시도만 되고 실제로는 실행되지 않는 문제

  • 해결 방법

    • 재시도 횟수 제한

    • 지수적 백오프 (Exponential Backoff) 전략 적용

      • 실패가 발생했을 때 재시도를 일정한 시간 간격으로 반복하는 대신, 재시도 간격을 지수적으로 늘려가는 전략. 예를 들어, 어떤 작업이 실패했을 때 1초 → 2초 → 4초 → 8초 → 16초... 이런 식으로 재시도 간격을 늘려가는 것

데이터 불일치 (Data Inconsistency)

  • 동기화되지 않은 상태에서 여러 스레드가 데이터를 수정해 비정상적인 결과를 초래하는 문제

  • 해결 방법

    • synchronized 키워드로 임계 영역 보호

    • Atomic 변수로 동기화 없이 안전하게 처리

    • volatile 키워드를 통해 최신 값 공유

  • Java 예시


꼬리 질문

  1. synchronized와 Lock의 차이를 설명해보세요.

  2. Java에서 데드락을 예방하는 방법은 무엇인가요?

  3. 동시성을 고려한 자료구조에는 어떤 것이 있나요?

참고

Last updated