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