[ Synchronized ]
synchronized는 자바에서 멀티스레딩 프로그래밍 시 데이터의 일관성을 보장하기 위해 사용되는 키워드이다. 여러 스레드가 동시에 동일한 자원에 접근할 때 발생할 수 있는 문제를 해결하는 데 도움을 준다.
synchronized의 주요 개념:
- 임계 구역 (Critical Section):
- 여러 스레드가 동시에 접근할 수 있는 코드 블록을 의미한다. 이 구역에 대한 접근을 제어하여 데이터의 무결성을 유지한다.
- 사용 방법:
- 메서드 수준 : synchronized를 메서드 선언 앞에 붙여 사용한다. 이 경우, 해당 메서드는 한 번에 하나의 스레드만 실행할 수 있다.
public synchronized void someMethod() { // 임계 구역 }
- 블록 수준 : 특정 코드 블록만 동기화할 수 있다. 이 경우, synchronized 블록 내에서 특정 객체를 지정한다.
public void someMethod() { synchronized (someObject) { // 임계 구역 } }
- 모니터 락 (Monitor Lock) : synchronized 키워드를 사용하면 해당 객체에 대한 모니터 락을 획득한다. 다른 스레드는 이 락이 해제될 때까지 해당 코드 블록에 접근할 수 없다.
- 메서드 수준 : synchronized를 메서드 선언 앞에 붙여 사용한다. 이 경우, 해당 메서드는 한 번에 하나의 스레드만 실행할 수 있다.
- 성능:
- 동기화는 스레드 안전성을 보장하지만, 과도하게 사용하면 성능 저하를 초래할 수 있다. 따라서 필요한 경우에만 사용해야 한다.
예제 :
class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
[ 임계 구역 (Critical Section) ]
임계 구역(Critical Section)은 여러 스레드가 동시에 접근할 수 있는 코드의 일부를 의미한다. 이 구역은 공유 자원(예: 변수, 데이터 구조 등)에 대한 접근을 포함한다. 여러 스레드가 동시에 이 임계 구역에 들어가면 데이터의 무결성이 손상될 수 있기 때문에, 이 구역에 대한 접근을 제어해야 한다.
임계 구역의 필요성:
- 데이터 무결성 : 여러 스레드가 동시에 공유 자원을 수정할 경우, 예기치 않은 결과를 초래할 수 있다. 예를 들어, 두 스레드가 동시에 같은 변수를 증가시키면, 예상보다 적은 횟수로 증가할 수 있다.
- 경합 상태 (Race Condition) : 여러 스레드가 동시에 자원에 접근하면서 발생할 수 있는 문제로, 이로 인해 프로그램의 예측할 수 없는 동작이 발생할 수 있다.
예제:
class Counter {
private int count = 0;
public void increment() {
count++; // 임계 구역
}
public int getCount() {
return count;
}
}
위 코드에서 increment 메서드는 count 변수를 수정하는 임계 구역이다. 여러 스레드가 이 메서드를 동시에 호출하면, 서로의 작업을 방해할 수 있다.
동기화의 필요성 :
이 임계 구역에 대한 접근을 제어하기 위해 synchronized 키워드를 사용한다. 이를 통해 한 스레드가 임계 구역에 진입하면 다른 스레드는 해당 구역에 들어갈 수 없게 된다.
class Counter {
private int count = 0;
public synchronized void increment() { // 동기화
count++;
}
public synchronized int getCount() {
return count;
}
}
이렇게 하면 increment 메서드가 실행되는 동안 다른 스레드는 이 메서드에 접근할 수 없게 되어, 데이터 무결성을 유지할 수 있다.
728x90
반응형
'JAVA' 카테고리의 다른 글
[JAVA] 싱글스레드(Single-Thread)와 멀티스레드(Multithreading)의 차이점 및 개념 (0) | 2024.12.29 |
---|---|
List.of , 예외 처리 (0) | 2024.10.25 |
[Java] StringBuilder (2) | 2024.10.07 |
[Java]배열 도입 - 리펙토링 (배열과 for문 선언 최적화) (0) | 2024.09.25 |