..
synchronized: 자바 임계 영역 제어하기
1. synchronized란?
자바에서 멀티스레드 환경을 다룰 때, 여러 스레드가 하나의 공유 자원에 동시에 접근하여 데이터가 꼬이는 것을 방지하기 위해 사용하는 키워드입니다. 이를 통해 Thread-Safe한 코드를 작성할 수 있습니다.
2. 동작 원리: 락(Lock) 메커니즘
- 상호 배제: 어떤 스레드가
synchronized가 붙은 메소드나 블록에 먼저 진입하면, 해당 객체에 대한 잠금(Lock)을 획득합니다. - 대기: 락을 획득한 스레드가 작업을 마칠 때까지 다른 스레드들은 문밖에서 기다려야 합니다.
- 해제: 작업이 끝나면 락을 반납(Unlock)하고, 기다리던 다음 스레드 중 하나가 락을 얻어 진입합니다.
3. 주요 사용법
메소드 전체에 적용
메소드 선언부에 키워드를 추가합니다. 메소드 전체가 임계 영역(Critical Section)이 됩니다.
public synchronized void increase() {
count++;
}
특정 블록에만 적용
메소드 내에서 동기화가 꼭 필요한 코드 조각만 감싸서 효율을 높입니다.
public void increase() {
// 공통 로직...
synchronized(this) {
count++;
}
}
synchronized는 데이터 안정성을 보장하지만, 너무 남발하면 병목 현상이 발생하여 성능이 저하될 수 있습니다. 꼭 필요한 구간에만 최소한으로 적용하는 것이 실력입니다.