JAVA

[JAVA] synchronized 블록

오선지♬ 2025. 9. 29. 10:21
728x90
반응형

Java에서 synchronized는 멀티스레드 환경에서 공유 자원을 안전하게 다루기 위해 사용하는 키워드예요.

1️⃣ 기본 개념

  • 멀티스레드 문제: 여러 스레드가 동시에 같은 자원(변수, 객체 등)에 접근하면 데이터가 꼬이거나 예상치 못한 결과가 발생할 수 있어요.
  • 해결책: synchronized를 사용해서 한 번에 하나의 스레드만 접근하도록 제한.
  • 락(Lock): synchronized는 내부적으로 **객체의 모니터(lock)**를 사용해 스레드 접근을 제어합니다.

2️⃣ synchronized 사용 방법

2-1. 메서드에 적용

public synchronized void increment() {
    count++;  // 한 스레드만 접근 가능
}
  • 이렇게 하면 increment() 메서드 전체가 동기화됩니다.
  • 장점: 간단하게 메서드 전체를 보호 가능
  • 단점: 메서드 전체가 잠기므로 성능 저하 가능

2-2. 블록에 적용

 
public void increment() {
    synchronized(this) {
        count++;  // 한 스레드만 접근 가능
    }
}
  • synchronized(this) → 현재 객체의 모니터(lock)를 사용
  • 장점: 필요한 부분만 동기화 가능 → 성능 향상
  • 다른 객체를 lock으로 사용할 수도 있음:
 
synchronized(someObject) { // someObject에 대해 lock 획득 }

3️⃣ 동작 원리

  1. 스레드가 synchronized 블록에 들어가려고 하면 락을 먼저 획득해야 함.
  2. 락을 얻으면 블록 안 코드를 실행.
  3. 블록 종료 시 자동으로 락 해제.
  4. 다른 스레드는 락이 해제될 때까지 기다림.

 


4️⃣ 예제

class Counter {
    private int count = 0;

    public void increment() {
        synchronized(this) { // 현재 객체에 대한 락 획득
            count++;
            System.out.println(Thread.currentThread().getName() + ": " + count);
        }
    }
}

public class SyncExample {
    public static void main(String[] args) {
        Counter counter = new Counter();

        Runnable task = () -> {
            for (int i = 0; i < 5; i++) {
                counter.increment();
            }
        };

        Thread t1 = new Thread(task, "Thread-1");
        Thread t2 = new Thread(task, "Thread-2");

        t1.start();
        t2.start();
    }
}

 

✅ 출력 예시:

Thread-1: 1
Thread-1: 2
Thread-1: 3
Thread-2: 4
Thread-2: 5

 

💡 정리:

  • synchronized = 스레드 안전하게 공유 자원 보호
  • 메서드 전체 또는 블록 단위로 사용 가능
  • 내부적으로 **모니터(락)**를 사용
  • wait()와 notify()는 반드시 synchronized 블록 안에서만 사용 가능
728x90
반응형

'JAVA' 카테고리의 다른 글

[JAVA] 스레드와 wait()와 notify() 상호작용  (0) 2025.10.02
[JAVA] 모니터(Monitor)  (0) 2025.10.01
[JAVA] Object.wait()  (0) 2025.09.25
[JAVA] Thread.sleep()  (0) 2025.09.24
[JAVA] String 배열 초기화  (0) 2025.07.21