Java 오류 & 개발/Java 기본 문법 & 오류
[Java] 멀티스레드(Thread) 기초와 동기화(Synchronization)
Jinsapp
2025. 3. 24. 22:00
[Java] 멀티스레드(Thread) 기초와 동기화(Synchronization)
1. 멀티스레드란?
Java에서는 하나의 프로그램 안에서
여러 작업을 동시에 처리할 수 있도록 Thread
를 지원합니다.
멀티스레드는 CPU 자원을 효율적으로 사용하게 하며,
UI 응답성 향상이나 병렬 작업 처리에 적합합니다.
2. Thread 생성 방법
✔ 방법 1: Thread 클래스 상속
class MyThread extends Thread {
public void run() {
System.out.println("Thread 실행 중");
}
}
public class Main {
public static void main(String[] args) {
MyThread t1 = new MyThread();
t1.start();
}
}
✔ 방법 2: Runnable 인터페이스 구현
class MyRunnable implements Runnable {
public void run() {
System.out.println("Runnable 실행 중");
}
}
public class Main {
public static void main(String[] args) {
Thread t2 = new Thread(new MyRunnable());
t2.start();
}
}
Thread
를 상속하거나 Runnable
을 구현해
run()
메서드에 실행할 코드를 작성하고,
start()
메서드를 호출하면 스레드가 실행됩니다.
3. 스레드 실행 결과 예시
스레드는 병렬로 실행되기 때문에 실행 순서는 매번 달라질 수 있습니다.
Thread 실행 중
Runnable 실행 중
4. 동기화(Synchronization)란?
여러 스레드가 공유 자원에 동시에 접근할 경우,
데이터 충돌이나 예상치 못한 결과가 발생할 수 있습니다.
이러한 문제를 방지하기 위해 Java는 synchronized
키워드를 제공합니다.
✔ 예시: 동기화하지 않은 경우
class Counter {
int count = 0;
public void increment() {
count++;
}
}
여러 스레드가 동시에 increment()
를 호출하면
count
값이 올바르게 증가하지 않을 수 있습니다.
✔ 예시: synchronized 적용
class Counter {
int count = 0;
public synchronized void increment() {
count++;
}
}
synchronized
키워드를 사용하면 한 번에 하나의 스레드만
해당 메서드에 접근할 수 있어 동시성 문제가 해결됩니다.
5. 메서드 vs 블록 동기화
- 메서드 전체 동기화:
public synchronized void method()
- 블록만 동기화:
public void method() {
synchronized(this) {
// 이 블록 내 코드만 동기화
}
}
6. 스레드 안전(Thread Safe)한 클래스 예시
Java에서는 다음과 같은 클래스들이 기본적으로 스레드에 안전하게 설계되어 있습니다.
- Vector
- Hashtable
- ConcurrentHashMap
- AtomicInteger
7. 멀티스레드에서 발생할 수 있는 문제들
- 데이터 레이스 (Race Condition)
- 데드락 (Deadlock)
- 라이브락 (Livelock)
- 기아 상태 (Starvation)
8. 정리
- Java에서 멀티스레드는
Thread
또는Runnable
로 구현 - 공유 자원 사용 시
synchronized
를 통해 동기화 처리 - 스레드 간 충돌 방지를 위해 구조적인 설계 필요
- 동시성 문제는 단순히 작동한다고 끝나는 것이 아니라 정확하게 작동하는지가 중요
🔗 관련 글도 함께 확인해보세요