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

상위 40가지 Java 멀티스레딩 인터뷰 질문 및 답변 – 2026년판

상위 40가지 Java 멀티스레딩 인터뷰 질문 및 답변 – 2026년판

Java 멀티스레딩 인터뷰를 준비하려면 동시성 개념과 실제 경험에 대한 깊은 이해가 필요합니다. 아래에서는 기본 정의부터 가상 스레드 및 구조적 동시성과 같은 고급 주제까지 모든 것을 다루는 신중하게 작성된 40개의 질문과 전문가의 답변을 찾을 수 있습니다.

👉 무료 PDF 다운로드:Java 멀티스레딩 인터뷰 질문 및 답변

1) Java의 멀티스레딩이란 무엇이며 왜 사용되나요?

멀티스레딩을 사용하면 Java 애플리케이션이 여러 스레드를 동시에 실행하여 CPU 활용도를 최대화하고 응답성을 향상시킬 수 있습니다. 이는 한 스레드가 차단되고 다른 스레드는 계속 처리될 수 있는 I/O 바인딩 작업, 대규모 계산 및 GUI 업데이트에 특히 유용합니다.

혜택

:웹 서버는 각 요청을 별도의 스레드에 할당하여 수십 개의 클라이언트 요청을 동시에 처리할 수 있으므로 I/O 작업이 차단되는 것을 방지할 수 있습니다.

2) Java 스레드의 수명주기를 설명합니다.

Java 스레드는 다음 상태를 통해 진행됩니다.

상태 설명
신규 스레드가 생성되었지만 아직 시작되지 않았습니다.
실행 가능 스레드가 실행 준비가 되었거나 현재 실행 중입니다.
차단됨 스레드가 모니터 잠금을 기다립니다.
대기 중 스레드는 다른 스레드의 신호를 무기한 기다립니다.
시간 초과 스레드는 지정된 기간 동안 기다립니다.
해지됨 스레드 실행이 완료되었습니다.

t.start()일 때 호출되면 스레드가 New에서 이동합니다. 실행 가능 .

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 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() 객체 알림을 기다리세요 통지시까지
sleep() 스레드 아니요 실행 일시중지 고정 시간
yield() 스레드 아니요 스케줄러 전환 제안 예측 불가능

wait() 사용 스레드 간 통신용 sleep()을 사용하세요 스레드를 일시 중지합니다.

9) Executor Framework는 스레드 관리를 어떻게 개선합니까?

프레임워크는 스레드 생성에서 작업 제출을 분리하여 효율적인 스레드 풀링 및 리소스 재사용을 가능하게 합니다. java.util.concurrent의 일부입니다. 그리고 다음을 제공합니다:

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

10) Java에서 사용할 수 있는 다양한 스레드 풀 유형은 무엇입니까?

풀 유형 팩토리 메소드 설명
FixedThreadPool newFixedThreadPool(n) 고정된 스레드 수
캐시된ThreadPool newCachedThreadPool() 필요에 따라 스레드를 생성하고 유휴 스레드를 재사용합니다.
단일스레드 실행자 newSingleThreadExecutor() 순차 실행을 위한 단일 작업자 스레드
ScheduledThreadPool newScheduledThreadPool(n) 지연되거나 주기적인 작업 지원
워크스틸링풀 newWorkStealingPool() 사용 가능한 프로세서를 동적으로 활용

11) Java의 교착 상태는 무엇이며 어떻게 방지할 수 있나요?

두 개 이상의 스레드가 서로 잠금을 해제할 때까지 무기한 기다릴 때 교착 상태가 발생합니다. 일반적으로 일관되지 않은 잠금 순서로 인해 발생합니다.

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

예방 전략:

  1. 일관적인 전역 순서로 잠금을 획득합니다.
  2. tryLock() 사용 시간 초과가 있습니다.
  3. 가능한 경우 중첩된 잠금을 피하세요.
  4. 수동 잠금보다 높은 수준의 동시성 유틸리티를 선호합니다.

12) synchronized의 차이점 및 ReentrantLock .

<헤드>
기능 synchronized 재진입 잠금
획득 암시적 lock()를 통해 명시적
잠금 해제 중 메소드 종료 시 자동 unlock()를 통한 수동
시도/시간 초과 사용할 수 없음 tryLock() 지원 그리고 시간 초과
공정성 구성할 수 없음 공정한 주문을 지지합니다
조건 변수 지원되지 않음 여러 Condition 지원 개체
ReentrantLock lock = new ReentrantLock();
if (lock.tryLock(1, TimeUnit.SECONDS)) {
    try { /* critical section */ } finally { lock.unlock(); }
}

13) volatile의 차이점 그리고 synchronized .

측면 휘발성 동기화
목적 가시성 원자성 + 가시성
원자성 보증 없음 보장
잠금 아니요
사용 사례 간단한 플래그 복합 연산
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)를 사용하여 잠금이 없고 스레드로부터 안전한 작업을 수행합니다. 동기화된 블록에 비해 간단한 업데이트에 대해 더 높은 처리량을 제공합니다.

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

16) 세마포어란 무엇이며 잠금과 어떻게 다른가요?

측면 세마포어 잠금
목적 동시 액세스 제한 상호 배제
허가 다중 싱글
차단 허가 취득 소유권 획득
사용 사례 연결 풀링 중요 섹션 보호
Semaphore sem = new Semaphore(3);
sem.acquire();
// use resource
sem.release();

17) 포크/조인 프레임워크를 설명하세요.

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() .
  6. 경합을 줄이기 위해 동기화 범위를 최소화합니다.
  7. 최적화 전 프로필; JFR 및 비동기 프로파일러와 같은 도구는 핫스팟을 식별하는 데 도움이 됩니다.

21) JMM(Java Memory Model)은 무엇이며 왜 중요한가요?

JMM은 스레드가 메모리를 통해 상호 작용하는 방식을 정의하여 가시성, 순서 및 원자성을 보장합니다. 이는 올바른 동시 코드를 작성하는 데 중요한 사전 발생 관계를 설정합니다.

22) ConcurrentHashMap과synchronousMap의 차이점

<헤드>
기능 ConcurrentHashMap 동기화된 지도
잠금 세분성 세그먼트 수준(일부) 전체 지도
경합 중인 실적 높음 낮음
Null 키/값 허용되지 않음 허용
반복자 일관성 약한 일관성 빠른 실패
동시 읽기 허용 차단됨

23) 교착 상태 감지 및 디버깅.

  1. jstack <pid>을 통한 스레드 덤프 교착상태를 드러냅니다.
  2. VisualVM 또는 JConsole은 실시간 스레드 모니터링을 제공합니다.
  3. ThreadMXBean.findDeadlockedThreads()를 사용한 프로그래밍 방식 감지 .

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

병렬 스트림은 내부적으로 Fork/Join 프레임워크를 사용하여 데이터 처리를 위한 고급 API를 제공합니다. 명시적 스레드는 수동 관리가 필요하지만 세밀한 제어 기능을 제공합니다.

측면 병렬 스트림 스레드
추상화 고수준 API 낮은 수준의 제어
관리 ForkJoinPool을 통한 자동 수동 스레드 풀
조정 공통 풀 사용 사용자 정의 풀 크기
오류 처리 제한적 모든 권한

25) CountDownLatch, CyclicBarrier 및 Phaser.

<헤드>
기능 카운트다운래치 순환장벽 페이저
재설정 아니요
파티 수정됨 수정됨 동적
사용 사례 작업이 완료될 때까지 기다리세요 만나야 할 스레드 동적 조정
CountDownLatch latch = new CountDownLatch(3);
for (...) new Thread(() -> { /* work */ latch.countDown(); }).start();
latch.await();

26) 호출 가능과 실행 가능의 차이점

측면 실행 가능 호출 가능
반환 값 아니요
확인된 예외 아니요
패키지 java.lang java.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(); // Producer
new Thread(() -> System.out.println(queue.take())).start(); // Consumer

28) 스레드 부족 및 라이브록.

우선순위가 낮은 스레드가 CPU 시간을 수신하지 못하는 경우 기아 상태가 발생합니다. 라이브록은 스레드가 지속적으로 상태를 변경하지만 진행되지 않을 때 발생합니다. 완화 방법에는 공정한 잠금, 바쁜 대기 방지 및 적절한 일정 관리가 포함됩니다.

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

  1. 스레드 풀을 사용하세요.
  2. 동기화 범위를 줄입니다.
  3. 동시 데이터 구조를 활용합니다.
  4. 불변 객체를 선호하세요.
  5. 허위 공유를 방지하세요.
  6. CPU 코어에 맞게 스레드 수를 조정합니다.
  7. 차단 작업에 비동기 I/O를 사용합니다.

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

결제 게이트웨이에서 동시 거래 처리는 다음을 통해 최적화되었습니다.

  1. 작업자 스레드를 위한 ExecutorService.
  2. 트랜잭션 상태에 대한 ConcurrentHashMap.
  3. 계정 수준 잠금을 위한 ReentrantLock.
  4. 일괄 동기화를 위한 CountDownLatch.
  5. 비동기 응답을 위한 CompletableFuture.

결과:처리량이 35% 증가하고 대기 시간이 40% 감소했습니다.

31) Java의 가상 스레드.

Java 21에 도입된 가상 스레드는 JVM에서 관리하는 경량 스레드로, 최소한의 오버헤드로 수백만 개의 동시 작업을 가능하게 합니다.

<헤드>
기능 플랫폼 스레드 가상 스레드
관리자 OS JVM
제작 비용 높음 매우 낮음
동시성 수준 수천 수백만
일정 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(); // restore flag
        break;
    }
}

35) 병렬성 대 동시성

동시성은 실행을 인터리브하여 여러 작업을 관리하는 반면, 병렬성은 여러 CPU 코어에서 동시에 작업을 실행합니다.

<헤드>
개념 정의
동시성 인터리빙 작업 1000개의 클라이언트 요청을 동시에 처리
병렬성 동시 실행 CPU 코어 전체에서 계산 실행

36) 스레드 프로파일링 도구 및 기술

도구 목적
j스택 스레드 덤프 캡처
jconsole / VisualVM 실시간 모니터링
JFR(자바 비행 기록 장치) 낮은 오버헤드 프로파일링
미션 제어(JMC) JFR 녹음 시각화
비동기 프로파일러 CPU 및 할당 프로파일링
ThreadMXBean 프로그래밍 방식 검사
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
System.out.println(bean.getThreadCount());

37) 일반적인 성능 병목 현상.

  1. 과도한 잠금 경합.
  2. 변수 공유가 잘못되었습니다.
  3. 컨텍스트 전환 오버헤드.
  4. 부적절한 동기화.
  5. 휘발성 변수의 남용.

최적화에는 세분화된 잠금, 잠금 없는 구조, 스레드 생성 최소화 및 스레드 로컬 저장소 사용이 포함됩니다.

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.

결과:최소한의 차단과 최적의 리소스 사용으로 수백만 개의 동시 연결을 달성합니다.

🔍 실제 시나리오와 전략적 대응이 포함된 최고의 Java 멀티스레딩 인터뷰 질문

다음은 면접관이 기대하는 10가지 현실적인 질문과 세련된 샘플 답변입니다.

1) Java에서 프로세스와 스레드의 차이점은 무엇인가요?

응시자는 OS 및 JVM 기본 사항, 메모리 사용량 및 실행 흐름을 설명해야 합니다. 예를 들어, 브라우저 프로세스에는 렌더링, 네트워킹 및 사용자 입력을 위한 여러 스레드가 포함되어 있습니다.

2) synchronized의 목적 키워드?

동시성 제어, 내장 잠금 및 스레드 안전성에 대해 설명합니다. 한 번에 하나의 스레드만 임계 섹션에 액세스하도록 보장합니다.

3) 까다로운 멀티스레딩 문제가 직면하고 해결되었습니까?

교착 상태 시나리오, 스레드 덤프를 통해 이를 식별한 방법, 일관된 잠금 순서를 적용하여 해결한 방법을 설명하세요.

4) Java 메모리 모델 및 가시성

관계 이전에 일어난 일을 설명하세요, volatile , 가시성과 순서를 보장하는 동기화 구성.

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

스레드 간 통신에 대해 설명하고 메커니즘을 모니터링합니다.

6) 멀티스레드 애플리케이션을 최적화하고 계신가요?

잠금 경합을 식별하고 synchronized를 교체하세요. ConcurrentHashMap 사용 , 측정 가능한 처리량 증가를 보여줍니다.

7) 공유 데이터 구조를 안전하게 업데이트하나요?

ReentrantLock을 사용하여 스레드로부터 안전한 컬렉션 또는 명시적 잠금을 사용하세요. 세밀한 제어가 가능합니다.

8) ExecutorService의 역할 ?

작업자 스레드 풀을 관리하고 오버헤드를 줄이며 수명 주기 관리를 단순화합니다.

9) 경쟁 조건 문제를 해결하시겠습니까?

로드 시 재현하고, 로깅을 강화하고, 적절한 동기화를 추가하여 수정하세요.

10) 우선순위가 다양한 멀티스레딩 솔루션을 설계하고 계십니까?

ThreadPoolExecutor으로 우선순위 대기열 사용 우선순위가 높은 작업을 위한 사용자 정의 비교기

java

  1. 예제가 있는 Java OOP의 다형성:What is, Dynamic
  2. 자바 예외 처리
  3. Java 날짜 및 시간:SimpleDateFormat, 현재 날짜 및 비교
  4. 자바 HashSet 클래스
  5. OOP에서 추상화란 무엇입니까? 자바 추상 ​​클래스 및 메소드
  6. EXAMPLE이 있는 Java 변수 및 데이터 유형
  7. 예제가 있는 Java Reflection API 자습서
  8. Java Diamond Operator:Java 7+에서 제네릭 단순화
  9. 자바 메소드
  10. Java NavigableSet 인터페이스