상호 배제

1
2
3
특정 공유자원을 한 순간에 한 개의 프로세스만 사용할 수 있을 떄, 프로세스 하나가 공유 데이터에 접근하는 동안 다른 프로세스가 해당 데이터를 접근할 수 없게 하는 것
다중 스레드 또는 프로세스가 공유 자원에 동시에 접근하는 것을 방지하기 위한 개념이다.
이는 주로 동기화 문제를 해결하기 위해 사용된다. 상호 배제는 임계 구역(크리티컬 섹션) 문제를 다루며, 임계 구역은 여러 스레드가 동시에 접근하면 안되는 코드 블록을 말한다.

임계 구역(Critical Section)

프로그램 내에서 공유 자원(데이터 등)에 접근하는 코드 영역
여러 스레드가 동시에 임계 구역에 들어가면 데이터 일관성 문제가 발생할 수 있음.

진입 섹션(Entry Section)

스레드가 임계 구역에 들어가기 전에 실행되는 코드
이 섹션에서는 스레드가 임계 구역에 들어갈 수 있는지 확인하고, 상호 배제를 보장함.

퇴장 섹션(Exit Section)

스레드가 임계 구역을 떠난 후 실행되는 코드
임계 구역에 다른 스레드가 들어갈 수 있도록 함.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Counter {
private int count = 0;
private final Lock lock = new ReentrantLock(); //Lock 객체

//증가 함수
public void increment() {
lock.lock();

try {
count++;
} finally {
lock.unlock();
}
}

//카운트 얻기
public int getCount() {
return count;
}
}

문제점

  • 교착 상태(Deadlock): 두 개 이상의 스레드가 서로 상대방의 락을 기다리며 무한 대기 상태에 빠짐.
  • 해결 방안: 락 순서를 부여하거나 타임아웃을 설정한다.
  • 기아(Starvation): 특정 스레드가 지속적으로 임계 구역에 진입하지 못하는 문제 발생.
  • 해결 방안: 공정한 락을 사용하거나 우선순위 할당을 한다.