산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Industrial programming >> java

2026년 Java 멀티스레딩 면접 질문 Top 40 & 답변 – 2026 에디션

2026년 Java 멀티스레딩 면접 질문 Top 40 & 답변 – 2026 에디션

Java 멀티스레딩 면접 준비는 동시성 개념에 대한 깊은 이해와 실무 경험을 요구합니다. 아래에서 기본 정의부터 가상 스레드와 구조적 동시성 같은 고급 주제까지 다루는 40개 엄선된 질문과 전문가 답변을 확인하세요.

👉 무료 PDF 다운로드: Java 멀티스레딩 면접 질문 & 답변

1) Java에서 멀티스레딩이란 무엇이며 왜 사용되는가?

멀티스레딩은 Java 애플리케이션이 여러 스레드를 동시에 실행하게 하여 CPU 활용도 극대화와 응답성 향상 가능케 합니다. 한 스레드가 블로킹되어도 다른 스레드가 계속 처리할 수 있어 I/O 바운드 작업, 대규모 계산, GUI 업데이트에 특히 유용.

이점

예시: 웹 서버가 각 요청을 별도 스레드에 할당해 수십 개 클라이언트 요청 동시 처리, I/O 연산 블로킹 회피.

2) Java에서 스레드 수명주기 설명

Java 스레드는 다음 상태 진행:

상태설명
New스레드 생성되었으나 아직 시작 안됨
Runnable실행 준비 또는 현재 실행 중
Blocked모니터 락 대기 중
Waiting다른 스레드 신호 무한 대기
Timed Waiting지정된 시간 대기
Terminated실행 완료

t.start() 호출 시 스레드는 New에서 Runnable로 이동.

3) 프로세스와 스레드 차이점은?

기준프로세스스레드
메모리자체 주소 공간프로세스 메모리 공유
통신IPC 필요메모리 직접 공유
생성 비용비쌈경량
장애 영향격리됨형제 영향 가능

예: 브라우저 프로세스에 렌더링, 네트워킹, 사용자 상호작용용 여러 스레드 포함.

4) Java에서 동기화 작동 원리?

동기화는 한 번에 한 스레드만 공유 자원 접근 보장, 레이스 컨디션과 데이터 손상 방지. synchronized 키워드가 전체 메서드나 특정 블록 락.

  1. 동기화 메서드 – 메서드 모니터 락
  2. 동기화 블록 – 선택한 객체 락
synchronized void increment() { count++; }

5) Java에서 스레드 생성 다른 방법들?

  1. Thread 확장
    class MyThread extends Thread { public void run() { System.out.println("Thread running"); } } new MyThread().start();
  2. Runnable 구현
    class MyRunnable implements Runnable { public void run() { System.out.println("Runnable running"); } } new Thread(new MyRunnable()).start();
  3. Callable & Future (모던) – 값 반환, 체크 예외 던질 수 있음.
    Callable task = () -> 42; Future result = executor.submit(task); System.out.println(result.get());

6) start()와 run() 차이?

측면start()run()
스레드 생성새 OS 스레드 생성현재 스레드서 실행
호출JVM 스레드 스케줄단순 메서드 호출
동시성비동기 실행순차 실행

t.start()는 새 스레드 시작; t.run()은 일반 메서드처럼 동작.

7) 스레드 안전성 개념과 달성 방법?

스레드 안전성은 공유 데이터 동시 접근 시 상태 손상 없음 보장. 달성 방법:

AtomicInteger counter = new AtomicInteger(); counter.incrementAndGet();

8) wait(), sleep(), yield() 차이?

메서드클래스락 해제목적지속시간
wait()Object예알림 대기알림까지
sleep()Thread아니오실행 일시정지고정 시간
yield()Thread아니오스케줄러 전환 제안예측불가

스레드 간 통신엔 wait(), 스레드 일시정지엔 sleep() 사용.

9) Executor 프레임워크가 스레드 관리 어떻게 개선?

프레임워크는 태스크 제출과 스레드 생성 분리, 효율적 스레드 풀링과 자원 재사용 가능케 함. java.util.concurrent 일부로 제공:

ExecutorService executor = Executors.newFixedThreadPool(5); executor.submit(() -> System.out.println("Task executed")); executor.shutdown();

10) Java에서 사용 가능한 스레드 풀 종류?

풀 타입팩토리 메서드설명
FixedThreadPoolnewFixedThreadPool(n)고정 스레드 수
CachedThreadPoolnewCachedThreadPool()필요시 스레드 생성, 유휴 재사용
SingleThreadExecutornewSingleThreadExecutor()순차 실행용 단일 워커 스레드
ScheduledThreadPoolnewScheduledThreadPool(n)지연/주기적 태스크 지원
WorkStealingPoolnewWorkStealingPool()가용 프로세서 동적 활용

11) Java 데드락이란 및 예방법?

데드락은 두 이상 스레드가 서로 락 해제 기다리며 무한 대기 발생. 보통 일관되지 않은 락 순서서 기인.

synchronized (A) { synchronized (B) { /*...*/ } } 
synchronized (B) { synchronized (A) { /*...*/ } } 

예방 전략:

  1. 전역적으로 일관된 순서로 락 획득
  2. 타임아웃 있는 tryLock() 사용
  3. 가능하면 중첩 락 회피
  4. 수동 락보다 고수준 동시성 유틸리티 선호

12) synchronized와 ReentrantLock 차이

기능synchronizedReentrantLock
획득암시적명시적 lock()
해제메서드 종료시 자동수동 unlock()
시도/타임아웃불가tryLock() 및 타임아웃 지원
공정성설정 불가공정 순서 지원
조건 변수미지원다중 Condition 객체 지원
ReentrantLock lock = new ReentrantLock(); if (lock.tryLock(1, TimeUnit.SECONDS)) { try { /* critical section */ } finally { lock.unlock(); } }

13) volatile과 synchronized 차이

측면volatilesynchronized
목적가시성원자성 + 가시성
원자성보장 안됨보장됨
락킹아니오예
용례단순 플래그복합 연산
volatile boolean running = true;
synchronized void increment() { count++; }

14) Java ThreadLocal 설명

ThreadLocal은 스레드별 데이터 제공, 공유 가변 상태 필요성 제거. 각 스레드 자신만의 격리된 복사본 접근.

ThreadLocal counter = ThreadLocal.withInitial(() -> 0); counter.set(counter.get() + 1);

15) Java 원자 클래스란 및 사용 이유?

원자 클래스(AtomicInteger, AtomicBoolean, AtomicReference)는 CAS(Compare-And-Swap) 사용해 락프리, 스레드 안전 연산 수행. 단순 업데이트에서 synchronized 블록보다 높은 처리량 제공.

AtomicInteger counter = new AtomicInteger(); counter.incrementAndGet();

16) 세마포어란 및 락과 차이?

측면세마포어락
목적동시 접근 제한상호 배제
허가다중단일
블로킹허가 획득소유권 획득
용례커넥션 풀링임계 구역 보호
Semaphore sem = new Semaphore(3); sem.acquire(); // 리소스 사용 sem.release();

17) Fork/Join 프레임워크 설명

Java 7 도입, 워크스틸링 알고리즘 사용해 재귀적으로 분할 가능한 태스크 병렬 실행. 유휴 스레드가 바쁜 스레드에서 작업 훔쳐 CPU 활용도 극대화.

class SumTask extends RecursiveTask { protected Integer compute() { if (end - start <= threshold) return computeDirectly(); int mid = (start + end) / 2; SumTask left = new SumTask(start, mid); SumTask right = new SumTask(mid, end); left.fork(); return right.compute() + left.join(); } }

18) CompletableFuture가 비동기 프로그래밍 어떻게 개선?

CompletableFuture는 논블로킹, 합성 가능 비동기 연산 가능케 하여 콜백 지옥 제거, 체이닝, 예외 처리, 병렬 합성 지원.

CompletableFuture.supplyAsync(() -> "Hello") .thenApply(str -> str + " World") .thenAccept(System.out::println);

19) 데몬 스레드란?

데몬 스레드는 백그라운드에서 가비지 컬렉션, 타이머 태스크 같은 서비스 제공. 사용자 스레드 남지 않으면 JVM이 모든 데몬 스레드 자동 종료.

Thread daemon = new Thread(() -> System.out.println("Daemon running")); daemon.setDaemon(true); daemon.start();

20) Java 멀티스레딩 모범 사례

  1. 고수준 동시성 유틸리티 선호(ExecutorService, BlockingQueue)
  2. 공유 가변 상태 회피, 불변성 선호
  3. 동기화 래퍼보다 동시성 컬렉션 사용
  4. 인터럽트 올바르게 처리 및 플래그 복원
  5. shutdown() 또는 shutdownNow()로 Executor 우아하게 종료
  6. 동기화 범위 최소화로 경합 감소
  7. 최적화 전 프로파일링; JFR, async-profiler 같은 도구로 핫스팟 식별

21) Java 메모리 모델(JMM)이란 및 중요성?

JMM은 스레드가 메모리를 통해 상호작용하는 방식 정의, 가시성, 순서, 원자성 보장. Happens-before 관계 수립, 올바른 동시 코드 작성에 핵심.

22) ConcurrentHashMap과 synchronizedMap 차이

기능ConcurrentHashMapsynchronizedMap
락킹 granularity세그먼트 수준(부분적)전체 맵
경합 하 성능높음낮음
Null 키/값불가가능
이터레이터 일관성약한 일관성Fail-fast
동시 읽기허용차단

23) 데드락 감지 및 디버깅

  1. jstack <pid> 스레드 덤프로 데드락 확인
  2. VisualVM 또는 JConsole로 실시간 스레드 모니터링
  3. ThreadMXBean.findDeadlockedThreads()로 프로그래밍 방식 감지

24) 병렬 스트림 vs 명시적 스레드

병렬 스트림은 내부적으로 Fork/Join 프레임워크 사용, 데이터 처리에 고수준 API 제공. 명시적 스레드는 수동 관리 필요하지만 세밀한 제어 제공.

측면병렬 스트림스레드
추상화고수준 API저수준 제어
관리ForkJoinPool 자동수동 스레드 풀
튜닝공통 풀 사용커스텀 풀 크기
에러 처리제한적완전 제어

25) CountDownLatch, CyclicBarrier, Phaser

기능CountDownLatchCyclicBarrierPhaser
리셋아니오예예
당사자고정고정동적
용례태스크 완료 대기스레드 만남동적 조정
CountDownLatch latch = new CountDownLatch(3); for (...) new Thread(() -> { /* work */ latch.countDown(); }).start(); latch.await();

26) Callable과 Runnable 차이

측면RunnableCallable
반환값아니오예
체크 예외아니오예
패키지java.langjava.util.concurrent
Callable task = () -> 42; Future result = executor.submit(task); System.out.println(result.get());

27) 생산자-소비자용 BlockingQueue

BlockingQueue는 생산자-소비자 패턴 단순화하는 스레드 안전 블로킹 연산 제공.

BlockingQueue queue = new ArrayBlockingQueue<>(10); new Thread(() -> queue.put(1)).start(); // 생산자 new Thread(() -> System.out.println(queue.take())).start(); // 소비자

28) 스레드 기아와 라이브락

기아는 저우선순위 스레드가 CPU 시간 못 받는 것. 라이브락은 스레드가 지속적 상태 변경하지만 진전 없음. 공정 락, 바쁜 대기 회피, 적절한 스케줄링으로 완화.

29> 멀티스레드 애플리케이션 성능 개선

  1. 스레드 풀 사용
  2. 동기화 범위 축소
  3. 동시 데이터 구조 활용
  4. 불변 객체 선호
  5. False sharing 회피
  6. CPU 코어 수에 맞춰 스레드 수 튜닝
  7. 블로킹 연산에 비동기 I/O 사용

30> 실제 멀티스레딩 시나리오

결제 게이트웨이에서 동시 트랜잭션 처리 최적화:

  1. ExecutorService 워커 스레드
  2. ConcurrentHashMap 트랜잭션 상태
  3. ReentrantLock 계정 수준 락
  4. CountDownLatch 배치 동기화
  5. CompletableFuture 비동기 응답

결과: 처리량 35% 증가, 지연시간 40% 감소.

31> Java 가상 스레드

Java 21 도입 가상 스레드는 JVM 관리 경량 스레드로 최소 오버헤드로 수백만 동시 태스크 가능.

기능플랫폼 스레드가상 스레드
관리 주체OSJVM
생성 비용높음매우 낮음
동시성 수준수천수백만
스케줄링OS 수준JVM 협력적
용례CPU 바운드I/O 바운드/고동시성
Thread.startVirtualThread(() -> System.out.println("Virtual thread running"));

32> 구조적 동시성

Java 21 프리뷰, 구조적 동시성은 다중 동시 태스크를 단일 단위로 취급해 함께 시작, 관리, 종료 보장. 고아 스레드 제거, 에러 전파 단순화.

try (var scope = new StructuredTaskScope.ShutdownOnFailure()) { Future user = scope.fork(() -> findUser()); Future order = scope.fork(() -> fetchOrderCount()); scope.join(); scope.throwIfFailed(); System.out.println(user.resultNow() + " has " + order.resultNow() + " orders."); }

33> Java 반응형 스트림

Reactive Streams는 논블로킹, 백프레셔 인식 데이터 스트림 처리 모델 제공, Project Reactor, RxJava, Spring WebFlux 같은 프레임워크 기반.

Flow.Publisher publisher = subscriber -> subscriber.onNext(42);

34> 올바른 스레드 인터럽트 처리

루프에서 Thread.interrupted() 항상 확인, 리소스 정리, InterruptedException 잡은 후 인터럽트 상태 보존.

while (!Thread.currentThread().isInterrupted()) { try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // 플래그 복원 break; } }

35> 병렬성 vs 동시성

동시성은 여러 태스크를 인터리빙 실행으로 관리, 병렬성은 여러 CPU 코어에서 태스크 동시 실행.

개념정의예시
동시성태스크 인터리빙1000 클라이언트 요청 동시 처리
병렬성동시 실행CPU 코어 전반 계산 실행

36> 스레드 프로파일링 도구와 기법

도구목적
jstack스레드 덤프 캡처
jconsole / VisualVM실시간 모니터링
Java Flight Recorder (JFR)저오버헤드 프로파일링
Mission Control (JMC)JFR 기록 시각화
async-profilerCPU & 할당 프로파일링
ThreadMXBean프로그래밍 방식 검사
ThreadMXBean bean = ManagementFactory.getThreadMXBean(); System.out.println(bean.getThreadCount());

37> 흔한 성능 병목

  1. 과도한 락 경합
  2. 변수 false sharing
  3. 컨텍스트 스위치 오버헤드
  4. 부적절한 동기화
  5. volatile 변수 과용

최적화: 세분화된 락, 락프리 구조, 스레드 생성 최소화, 스레드 로컬 저장소 활용.

38> 락프리, 웨이트프리, 옵스트럭션프리 알고리즘

유형정의보장
락프리최소 한 스레드 진전시스템 전체 진전
웨이트프리모든 스레드 한정 단계 내 진전최강 보장
옵스트럭션프리경합 없을 때 진전최약 보장

AtomicInteger 연산은 락프리; 블로킹 큐는 락 사용.

39> ForkJoinPool 내부

각 워커 자체 덱 유지; 유휴 워커가 다른 워커서 태스크 훔쳐 경합 감소, 처리량 향상.

ForkJoinPool pool = new ForkJoinPool(); pool.submit(() -> IntStream.range(0, 100).parallel().forEach(System.out::println));

40> 초당 수백만 요청 처리 고동시성 시스템 설계

  1. 가상 스레드로 경량 요청 처리
  2. 반응형 스트림으로 비동기 I/O
  3. 구조적 동시성으로 예측 가능 태스크 라이프사이클
  4. 고성능 캐시(ConcurrentHashMap, Caffeine)
  5. 스레드 안전 큐(Disruptor, BlockingQueue)
  6. JFR & JMC로 모니터링
  7. CompletableFuture로 비동기 워크플로

결과: 최소 블로킹과 최적 자원 사용으로 수백만 동시 연결 달성.

🔍 실전 시나리오와 전략적 답변으로 본 Top Java 멀티스레딩 면접 질문

아래 열 가지 현실적 질문, 면접관 기대사항, 다듬어진 샘플 답변.

1) Java에서 프로세스와 스레드 차이?

지원자 OS와 JVM 기초, 메모리 사용, 실행 흐름 설명해야 함. 예: 브라우저 프로세스에 렌더링, 네트워킹, 사용자 입력용 다중 스레드 포함.

2) synchronized 키워드 목적?

동시성 제어, 고유 락, 스레드 안전성 설명. 한 번에 한 스레드만 임계 구역 접근 보장.

3) 직면한 까다로운 멀티스레딩 이슈와 해결?

데드락 시나리오, 스레드 덤프로 식별, 일관된 락 순서 강제로 해결 과정 기술.

4) Java 메모리 모델과 가시성?

Happens-before 관계, volatile, 가시성과 순서 보장 동기화 구문 설명.

5) wait(), notify(), notifyAll() 차이?

스레드 간 통신과 모니터 메커니즘 설명.

6) 멀티스레드 애플리케이션 최적화?

락 경합 식별, synchronized를 ConcurrentHashMap으로 대체, 측정 가능한 처리량 향상 제시.

7) 공유 데이터 구조 안전 업데이트?

스레드 안전 컬렉션 또는 ReentrantLock 명시적 락으로 세밀 제어.

8) ExecutorService 역할?

워커 스레드 풀 관리, 오버헤드 감소, 라이프사이클 관리 단순화.

9) 레이스 컨디션 트러블슈팅?

부하 하 재현, 로깅 강화, 적절한 동기화 추가로 수정.

10> 다양한 우선순위 갖는 멀티스레딩 솔루션 설계?

커스텀 비교자 가진 우선순위 큐와 ThreadPoolExecutor로 고우선순위 태스크 처리.

java

  1. Java SortedSet 마스터하기: TreeSet과 주요 메서드 실전 가이드
  2. Java 제네릭 마스터하기: 재사용 가능하고 타입 안전한 코드 작성
  3. Java 기본 데이터 타입: 8가지 타입 완벽 가이드와 예제
  4. 자바 객체 직렬화: 객체 영속화와 복원
  5. Java FileInputStream 완전 정복: 핵심 메서드와 실전 코드 예제
  6. Java 8 설정: 쉬운 환경 구성 가이드
  7. 2026년 Java 멀티스레딩 면접 질문 Top 40 & 답변 – 2026 에디션
  8. Java 8 함수형 인터페이스 마스터하기: 종합 가이드
  9. 자바 메서드 마스터하기: 생성, 호출, 추상화
  10. Java LinkedBlockingQueue 마스터: 완벽 가이드 & 실전 예제