..

synchronized: 자바 임계 영역 제어하기

1. synchronized란?

자바에서 멀티스레드 환경을 다룰 때, 여러 스레드가 하나의 공유 자원에 동시에 접근하여 데이터가 꼬이는 것을 방지하기 위해 사용하는 키워드입니다. 이를 통해 Thread-Safe한 코드를 작성할 수 있습니다.

2. 동작 원리: 락(Lock) 메커니즘

  1. 상호 배제: 어떤 스레드가 synchronized가 붙은 메소드나 블록에 먼저 진입하면, 해당 객체에 대한 잠금(Lock)을 획득합니다.
  2. 대기: 락을 획득한 스레드가 작업을 마칠 때까지 다른 스레드들은 문밖에서 기다려야 합니다.
  3. 해제: 작업이 끝나면 락을 반납(Unlock)하고, 기다리던 다음 스레드 중 하나가 락을 얻어 진입합니다.

3. 주요 사용법

메소드 전체에 적용

메소드 선언부에 키워드를 추가합니다. 메소드 전체가 임계 영역(Critical Section)이 됩니다.

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

특정 블록에만 적용

메소드 내에서 동기화가 꼭 필요한 코드 조각만 감싸서 효율을 높입니다.

public void increase() {
    // 공통 로직...
    synchronized(this) {
        count++;
    }
}

synchronized는 데이터 안정성을 보장하지만, 너무 남발하면 병목 현상이 발생하여 성능이 저하될 수 있습니다. 꼭 필요한 구간에만 최소한으로 적용하는 것이 실력입니다.