synchronized 키워드는 어떤 역할을 하나요?
synchronized 키워드의 역할 `synchronized` 키워드는 자바(Java)에서 멀티스레드 환경에서 동기화(synchronization)를 보장하기 위한 키워드 입니다.
멀티스레드 프로그램에서 여러 스레드가 동시에 하나의 공유 자원(예: 변수, 객체 등)에 접근할 때, 예상치 못한 결과가 발생할 수 있습니다.
이 문제를 스레드 간 경합(race condition) 이라고 하며, 데이터의 일관성(consistency)이 깨질 위험이 있습니다.
`synchronized` 키워드는 이와 같은 문제를 막기 위해 다음과 같은 역할을 합니다: 1. 임계 영역(critical section) 보호 `synchronized`로 지정된 메서드나 블록 안의 코드는 한 번에 오직 하나의 스레드만 실행할 수 있습니다.
즉, 여러 스레드가 동시에 실행되지 않고 순차적으로 실행되어 안전하게 공유 자원에 접근할 수 있습니다.
2. 모니터 락 획득 및 해제 `synchronized`를 사용할 경우, 해당 객체의 모니터 락(monitor lock) 을 자동으로 획득하고, 코드 실행이 끝나면 락을 자동으로 해제합니다.
락이 해제되기 전에는 다른 스레드가 해당 영역에 진입하지 못합니다.
3. 메모리 가시성 보장 `synchronized`블록 안에서 수행된 변경 사항은 락이 해제되는 시점에 다른 스레드에게 확실히 반영됩니다.
이를 통해 스레드 간에 변수 값이나 상태가 제대로 공유되도록 합니다.
--- synchronized 사용 예시 ```java public class Counter { private int count = 0; public synchronized void increment() { count++; // 한 스레드만 접근 가능 } public synchronized int getCount() { return count; } } ``` 위 코드에서 `increment()` 메서드가 `synchronized`를 통해 보호되므로, 여러 스레드가 동시에 `increment()`를 호출해도 `count` 값이 올바르게 증가합니다.
또는 동기화 블록 형태로 사용할 수도 있습니다: ```java public void increment() { synchronized(this) { count++; } } ``` --- 요약 - `synchronized`는 멀티스레드 환경에서 데이터 일관성 보장을 위한 동기화 키워드 입니다.
- 한 번에 하나의 스레드만 공유 자원에 안전하게 접근하도록 임계 영역을 설정 합니다.
- 해당 객체의 모니터 락을 획득 및 해제 하여 스레드 실행 순서를 제어합니다.
- 메모리 가시성 문제도 해결 하여 다른 스레드가 최신 상태를 볼 수 있도록 합니다.
이를 통해 `synchronized`는 스레드 간 경쟁 조건과 불일치 문제를 예방 하고, 안정적인 동시성 프로그래밍을 가능하게 합니다.