자바에서 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()는 한 스레드만 접근 가능 → 데이터 충돌 없음