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를 통해 동기화 처리
  • 스레드 간 충돌 방지를 위해 구조적인 설계 필요
  • 동시성 문제는 단순히 작동한다고 끝나는 것이 아니라 정확하게 작동하는지가 중요

🔗 관련 글도 함께 확인해보세요

Java 동시성 프로그래밍 기초 개념 정리