Development/Java

Java 멀티스레딩과 동기화 완벽 가이드

최라온 2025. 5. 14. 15:36
728x90
반응형
SMALL

Java 멀티스레딩과 동기화 완벽 가이드

Java는 멀티스레딩(Multithreading)을 기본으로 지원하며, 여러 작업을 동시에 처리하는 프로그램을 쉽게 만들 수 있습니다. 이 글에서는 스레드(Thread)의 개념부터 동기화(Synchronization)까지 Java 멀티스레드 프로그래밍의 핵심을 정리합니다.

1. 스레드란?

스레드는 하나의 프로세스 내에서 실행되는 독립적인 실행 흐름입니다. 멀티스레딩을 사용하면 동시에 여러 작업을 수행할 수 있어 CPU 자원을 효율적으로 활용할 수 있습니다.

2. 스레드 생성 방법

2.1 Thread 클래스 상속

class MyThread extends Thread {
    public void run() {
        System.out.println("스레드 실행");
    }
}

MyThread t = new MyThread();
t.start();

2.2 Runnable 인터페이스 구현

class MyRunnable implements Runnable {
    public void run() {
        System.out.println("Runnable 실행");
    }
}

Thread t = new Thread(new MyRunnable());
t.start();

3. 멀티스레드 예제

for (int i = 0; i < 3; i++) {
    new Thread(() -> {
        System.out.println(Thread.currentThread().getName() + " 실행");
    }).start();
}

4. 동기화(Synchronization)

여러 스레드가 동시에 공유 자원에 접근할 경우 데이터 충돌이나 오류가 발생할 수 있습니다. 이를 방지하기 위해 동기화가 필요합니다.

4.1 synchronized 키워드

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }
}

4.2 synchronized 블록

public void increment() {
    synchronized (this) {
        count++;
    }
}

5. volatile 키워드

volatile은 변수의 값을 모든 스레드가 메인 메모리에서 읽도록 보장합니다. 주로 상태 플래그와 같이 간단한 동기화에 사용됩니다.

private volatile boolean running = true;

6. 실무에서의 스레드 관리 팁

  • 스레드 풀 사용: ExecutorService로 스레드 재사용
  • Lock 객체: ReentrantLock으로 유연한 동기화
  • 동시성 컬렉션: ConcurrentHashMap, CopyOnWriteArrayList 등 사용

7. ExecutorService 예시

ExecutorService executor = Executors.newFixedThreadPool(3);

executor.submit(() -> {
    System.out.println("작업 실행");
});

executor.shutdown();

8. 결론

Java 멀티스레딩은 고성능 애플리케이션 개발에 필수적인 기술입니다. 스레드 생성, 실행, 동기화 방법을 정확히 이해하고, ExecutorLock 같은 고급 API를 적절히 활용하면 안정적이고 효율적인 멀티스레드 프로그램을 구현할 수 있습니다.

728x90
반응형
LIST