synchronized 키워드의 용도는 무엇인가요?
synchronized 키워드는 주로 멀티스레드 프로그래밍에서 동기화(synchronization) 를 위해 사용됩니다.
자바(Java)를 비롯한 여러 프로그래밍 언어에서 제공되는 이 키워드는 여러 스레드가 동시에 공유 자원(예: 변수, 객체 등)에 접근할 때 발생할 수 있는 경쟁 조건(race condition) 이나 데이터 불일치 문제 를 방지하는 역할을 합니다.
주요 용도와 기능 1. 상호 배제(Mutual Exclusion) synchronized 키워드가 적용된 코드 블록 혹은 메서드는 한 번에 오직 한 스레드만 접근할 수 있습니다.
즉, 스레드가 synchronized 영역에 진입하면 해당 영역에 대한 락(lock)을 획득하고, 작업이 끝난 후 락을 해제합니다.
이를 통해 여러 스레드가 동시에 공유 데이터에 쓰기 작업을 시도해 데이터가 깨지거나 예기치 않은 결과가 나오는 상황을 방지할 수 있습니다.
2. 임계 구역 보호(Critical Section Protection) 공유 자원에 대한 읽기/쓰기 작업을 하는 부분을 임계 구역이라고 하는데, synchronized를 사용하면 이 임계 구역을 보호해 스레드 간 안전한 실행을 보장합니다.
3. 원자성 보장(Atomicity Guarantee) synchronized 메서드 또는 블록 안에서 실행되는 코드는 중단되지 않고 한 번에 완료되므로 원자성이 보장됩니다.
예를 들어, 공유 변수의 증가 연산(i++) 같은 작업을 안전하게 수행할 수 있습니다.
사용 예시 ```java public class Counter { private int count = 0; public synchronized void increment() { count++; } public synchronized int getCount() { return count; } } ``` 위 코드에서 `increment()` 메서드는 여러 스레드가 동시에 호출하더라도 동기화된 상태로 실행되어 `count` 값이 올바르게 증가합니다.
또한 synchronized는 메서드뿐 아니라 특정 코드 블록에도 적용할 수 있습니다: ```java public void add(int value) { synchronized(this) { count += value; } } ``` `synchronized(this)`는 현재 객체 인스턴스를 락으로 사용해 동기화를 수행합니다.
참고 사항 - synchronized는 성능에 영향을 줄 수 있기 때문에 필요할 때만 사용하는 것이 좋습니다.
- 자바 5 이후에는 더 정교하고 성능이 좋은 `java.util.concurrent` 패키지 내의 락(lock) 클래스들이 추가되어 병행 프로그래밍에 널리 활용됩니다.
--- synchronized 키워드는 멀티스레드 환경에서 공유 자원에 대한 동시 접근 문제를 방지하기 위해, 코드 실행을 상호 배제 방식으로 보호하는 데 사용됩니다 . 이를 통해 데이터의 무결성을 지키고, 프로그램의 안정성을 높일 수 있습니다.