`Java`에서 `synchronized` 키워드는 멀티스레딩 환경에서 공유 데이터에 대한 동시 접근을 제어하기 위한 메커니즘을 제공합니다. 멀티스레딩 환경에서는 여러 스레드가 동시에 실행되므로 공유 데이터에 대한 동시 업데이트로 인한 문제를 방지하기 위해 동기화가 필요합니다.
`synchronized` 키워드를 사용하면 특정 메서드 블록이나 메서드 전체를 하나의 스레드만 실행할 수 있도록 제한할 수 있습니다. 이를 통해 한 번에 하나의 스레드만이 공유 데이터에 접근하여 데이터의 일관성을 유지할 수 있습니다.
아래는 `synchronized`의 사용법과 예시에 대한 설명입니다.
1. **메서드 동기화:**
public class SynchronizedExample {
private int sharedData = 0;
// synchronized 키워드를 사용하여 메서드 동기화
public synchronized void updateData() {
// 공유 데이터를 업데이트하는 코드
sharedData++;
System.out.println("Updated data: " + sharedData);
}
}
위의 예제에서 `updateData` 메서드는 `synchronized` 키워드로 동기화되어 있습니다. 이로 인해 하나의 스레드만이 `updateData` 메서드를 실행할 수 있습니다. 다른 스레드가 접근하려고 하면 대기해야 합니다.
2. **블록 동기화:**
public class SynchronizedExample {
private static final Object lock = new Object();
private int sharedData = 0;
public void updateData() {
// 일부 코드는 동기화하지 않음
synchronized (lock) {
// 동기화된 블록 내에서 공유 데이터를 업데이트하는 코드
sharedData++;
System.out.println("Updated data: " + sharedData);
}
// 일부 코드는 동기화하지 않음
}
}
위의 예제에서는 메서드 전체가 아닌 특정 블록만 `synchronized`로 동기화되어 있습니다. `synchronized` 블록은 특정 객체나 클래스를 사용하여 동기화됩니다. 여기서는 `lock` 객체를 사용하고 있습니다.
3. **정적 메서드 동기화:**
public class SynchronizedExample {
private static int sharedData = 0;
// 정적 메서드 동기화
public static synchronized void updateData() {
// 공유 데이터를 업데이트하는 코드
sharedData++;
System.out.println("Updated data: " + sharedData);
}
}
정적 메서드에 `synchronized` 키워드를 사용하면 해당 클래스의 모든 인스턴스가 아닌 클래스 자체에 대한 동기화가 이루어집니다.
`synchronized`를 사용하면 멀티스레딩 환경에서의 데이터 일관성과 안전성을 보장할 수 있지만, 과도한 동기화는 성능 저하를 일으킬 수 있으므로 신중하게 사용해야 합니다. 또한 Java 5부터는 `java.util.concurrent` 패키지를 통해 더 유연하고 효율적인 동시성 제어 방법을 제공하고 있으므로, 상황에 따라 적절한 방법을 선택하는 것이 중요합니다.
'게으른 개발자의 끄적거림' 카테고리의 다른 글
HTML 특수문자 (> < & ) 변환 방법 (0) | 2024.01.31 |
---|---|
Javascript test()를 이용한 특정 문자열 확인 (0) | 2024.01.30 |
Java System.getproperty()란? (0) | 2024.01.29 |
Servlet(서블릿)이란? (1) | 2024.01.25 |
Javascript beforeunload load unload 이벤트 (0) | 2024.01.24 |