본문 바로가기

Programming/Java

면접에서 진짜 자주 나오는 자바 질문 - 섹션 3. 자바 동시성 및 멀티스레딩

반응형

 

1. 자바에서 스레드(Thread)를 생성하는 방법과 차이점

자바에서 스레드를 생성하는 방법은 대표적으로 3가지가 있다:

  • Thread 클래스 상속
  • Runnable 인터페이스 구현
  • ExecutorService 또는 Callable을 이용한 Thread Pool 방식
// 1. Thread 상속
class MyThread extends Thread {
    public void run() {
        System.out.println("Thread 실행!");
    }
}

// 2. Runnable 구현
class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Runnable 실행!");
    }
}

// 3. ExecutorService
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> System.out.println("ThreadPool 실행"));

일반적으로 Thread 상속보다는 Runnable 구현 방식이 더 많이 사용되며, 실제 서비스에서는 성능과 안정성을 고려해 ExecutorService 기반의 스레드 풀을 활용하는 것이 좋다.


2. 동기화(Synchronization)란 무엇이며 어떻게 사용하는가?

멀티스레드 환경에서 공유 자원에 여러 스레드가 동시에 접근하면, 데이터 충돌이나 일관성 문제가 발생할 수 있어. 이를 방지하기 위해 사용하는 것이 동기화(Synchronization)야.

  • 자바에서는 synchronized 키워드를 이용해 메서드 또는 코드 블록을 락(lock)으로 감싸 동기화 처리할 수 있다.
public synchronized void increment() {
    count++;
}

// 또는 블록 단위로
synchronized (this) {
    count++;
}

동기화를 과도하게 사용하면 성능 저하가 발생할 수 있으니, 꼭 필요한 경우에만 제한적으로 사용하는 것이 중요하다.


3. volatile 키워드의 의미와 사용 사례

volatile 키워드는 변수의 값을 스레드 간에 항상 일관되게 유지하기 위해 사용돼. 자바에서 변수는 CPU 캐시에 저장되기도 하는데, volatile은 해당 변수의 값을 메인 메모리에서 항상 읽도록 강제하는 역할을 해.

private volatile boolean running = true;

public void stop() {
    running = false;
}

단, volatile은 원자성(atomicity)을 보장하지 않기 때문에, count++와 같은 연산에는 사용할 수 없어. 이럴 땐 AtomicInteger를 써야 해.


4. 동시성 컬렉션(Concurrent Collections)의 종류와 특징

멀티스레드 환경에서는 일반 ArrayList나 HashMap은 스레드 안전하지 않아. 자바는 java.util.concurrent 패키지를 통해 동시성 컬렉션을 제공해.

  • ConcurrentHashMap: 고성능 동시 접근을 허용하는 Map
  • CopyOnWriteArrayList: 쓰기 작업 시 새로운 복사본을 만드는 List
  • BlockingQueue: 생산자-소비자 패턴에서 유용한 큐 구조

일반 컬렉션에 비해 성능 최적화된 구조를 가지고 있으며, 동기화 코드를 직접 작성하지 않고도 안전하게 사용할 수 있다.


5. 자바의 락(Lock) 인터페이스와 ReentrantLock의 특징

자바는 synchronized 외에도 java.util.concurrent.locks 패키지에 Lock 인터페이스 기반의 명시적 락을 제공한다.

  • ReentrantLock: 같은 스레드가 여러 번 락을 획득할 수 있는 재진입 가능한 락
  • 특징:
    • tryLock(): 락을 시도하고 실패할 수 있음
    • lockInterruptibly(): 인터럽트가 가능
    • 조건 변수(Condition)를 통해 정교한 동기화 제어 가능
Lock lock = new ReentrantLock();

lock.lock();
try {
    // 공유 자원 접근
} finally {
    lock.unlock();
}

ReentrantLock은 synchronized보다 세밀한 제어가 가능하며, 복잡한 동기화 상황에서 더 유리한 선택이 될 수 있다.

 

섹션4. 자바8 핵심기능 ↓

https://biesil.tistory.com/73

 

면접에서 진짜 자주 나오는 자바 질문 - 섹션 4. 자바 8 핵심 기능

1. 람다 표현식(Lambda Expression) 소개람다 표현식은 익명 함수를 간결하게 표현하는 문법으로, 함수형 프로그래밍 스타일을 자바에 도입하였다.형식:(매개변수) -> { 실행문 }예시:List list = Arrays.asLis

biesil.tistory.com

 

 

반응형