synchronized - 동기화

수뱀 ㅣ 2025. 7. 23. 18:23

자바에서 synchronized는 **동기화(synchronization)**를 위해 사용되는 키워드로, 멀티스레드 환경에서 공유 자원의 일관성과 원자성 보장을 위해 사용된다

 

 

목적

 

  • 여러 스레드가 동시에 하나의 객체나 메서드에 접근할 때, 동시 접근으로 인한 데이터 충돌/오류 방지
  • 임계 영역(Critical Section) 보호

 

 

 

사용 형태

1. synchronized 메서드

public synchronized void method() {
    // 한 번에 하나의 스레드만 이 메서드 실행 가능
}

 

  • 인스턴스 메서드인 경우: 객체 단위로 lock
  • static 메서드인 경우: 클래스 단위로 lock

 

2. synchronized 블록

public void method() {
    synchronized(this) {
        // 동기화 블록
    }
}

 

synchronized(공유객체) {
    // 공유 객체를 기준으로 락 걸림
}

 

 

 

동작 방식

 

  • synchronized는 내부적으로 monitor lock (모니터 락) 을 사용
  • 락을 획득한 스레드만 해당 코드 실행 가능
    다른 스레드는 락이 해제될 때까지 대기

 

예시코드

class Counter {
    private int count = 0;

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

    public int getCount() {
        return count;
    }
}

 

※ 멀티스레드 환경에서도 increment()는 한 스레드만 접근 가능 → 데이터 충돌 없음