🔍 뮤텍스(Mutex)와 세마포어(Semaphore)의 차이점
뮤텍스(Mutex)와 세마포어(Semaphore) 는 멀티스레드 환경에서 동기화(Synchronization)를 위해 사용되는 기법입니다.
둘 다 공유 자원(Shared Resource)에 대한 접근을 제어하지만, 개념과 동작 방식에 차이가 있습니다.
✅ 1. 뮤텍스(Mutex)란?
📌 개념
- Mutual Exclusion(상호 배제)의 약자로, 하나의 스레드만 공유 자원에 접근 가능하도록 제한하는 방식.
- 🔒 하나의 뮤텍스는 한 번에 하나의 스레드만 소유 가능 (Lock 기반).
- 🔓 락을 획득한 스레드만 공유 자원을 사용할 수 있으며, 사용이 끝나면 락을 해제해야 함.
📝 Java에서 뮤텍스 예제 (ReentrantLock)
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class MutexExample {
private static final Lock lock = new ReentrantLock();
public static void main(String[] args) {
Runnable task = () -> {
lock.lock(); // 🔒 락 획득
try {
System.out.println(Thread.currentThread().getName() + " is accessing the resource.");
Thread.sleep(1000); // 공유 자원 사용
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock(); // 🔓 락 해제
}
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start();
t2.start();
}
}
📌 실행 결과 (하나의 스레드만 실행됨)
Thread-0 is accessing the resource.
(1초 후)
Thread-1 is accessing the resource.
✔ 하나의 스레드만 락을 획득하여 공유 자원을 사용 가능
✔ 다른 스레드는 락이 해제될 때까지 기다려야 함
✅ 2. 세마포어(Semaphore)란?
📌 개념
- 여러 개의 스레드가 동시에 공유 자원에 접근할 수 있도록 제한하는 방식.
- 🟢 제한된 개수(N) 만큼의 스레드만 공유 자원에 접근 가능 (Permit 기반).
- 🚦 뮤텍스는 단일 접근(1개의 스레드)만 허용하지만, 세마포어는 여러 개(N개의 스레드)를 허용할 수 있음.
📝 Java에서 세마포어 예제
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private static final Semaphore semaphore = new Semaphore(2); // 최대 2개의 스레드 허용
public static void main(String[] args) {
Runnable task = () -> {
try {
semaphore.acquire(); // 🟢 접근 허용 (permit 획득)
System.out.println(Thread.currentThread().getName() + " is accessing the resource.");
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 🔴 사용 후 permit 반환
}
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
Thread t3 = new Thread(task);
t1.start();
t2.start();
t3.start();
}
}
📌 실행 결과 (최대 2개 스레드 동시 실행)
Thread-0 is accessing the resource.
Thread-1 is accessing the resource.
(2초 후)
Thread-2 is accessing the resource.
✔ 최대 2개의 스레드가 동시에 공유 자원을 사용 가능
✔ 세 번째 스레드는 두 개의 스레드가 끝날 때까지 대기함
✅ 3. 뮤텍스(Mutex) vs 세마포어(Semaphore) 차이점 정리
구분 | 뮤텍스(Mutex) | 세마포어(Semaphore) |
주요 개념 | 한 번에 하나의 스레드만 자원 접근 가능 | N개의 스레드가 동시에 접근 가능 |
사용 목적 | 단일 접근(Exclusive Lock) | 제한된 동시 접근(Control Multiple Access) |
구현 방식 | lock() / unlock() | acquire() / release() |
Permit 개수 | 항상 1 (Binary) | N 개의 permit을 설정 가능 |
예제 클래스 | ReentrantLock, synchronized | Semaphore |
사용 사례 | 한 번에 하나의 프로세스만 자원 접근 필요할 때 (예: 파일 쓰기) | 제한된 개수의 스레드가 동시에 접근해야 할 때 (예: 데이터베이스 연결 풀) |
✅ 4. 뮤텍스와 세마포어의 활용 사례
사용 사례 | 뮤텍스(Mutex) | 세마포어(Semaphore) |
은행 계좌 동시 접근 방지 | ✔ | ❌ |
파일 시스템 동시 접근 제어 | ✔ | ❌ |
데이터베이스 연결 풀 (DB Connection Pool) | ❌ | ✔ |
멀티스레드 다운로드 속도 제한 | ❌ | ✔ |
리소스 사용 개수 제한 (예: 프린터 2대) | ❌ | ✔ |
🎯 정리
구분 | 뮤텍스(Mutex) | 세마포어(Semaphore) |
정의 | 한 번에 하나의 스레드만 자원 접근 가능 | 여러 개의 스레드가 동시에 접근 가능 |
특징 | 락(Lock) 기반 | Permit 기반 |
제한 개수 | 1개 (단일 락) | N개 (멀티 락) |
주요 메서드 | lock(), unlock() | acquire(), release() |
사용 예제 | ReentrantLock, synchronized | Semaphore |
대표적인 사용처 | 단일 접근 제한 (파일 쓰기) | 동시 접근 개수 제한 (DB Connection Pool) |
📌 결론:
- 뮤텍스(Mutex) → 하나의 스레드만 공유 자원을 사용 가능 (배타적 락) 🔒
- 세마포어(Semaphore) → 여러 개의 스레드가 동시에 접근 가능 (N개 제한) 🚦
- 뮤텍스는 단일 락, 세마포어는 제한된 동시 실행을 관리하는 도구! 🚀
반응형
'서버&백엔드 > 🔥 JAVA' 카테고리의 다른 글
힙 메모리 부족 문제 (0) | 2025.02.04 |
---|---|
스레드에서 생성된 메모리 영역은 다른 스레드에서 접근 가능할까? (0) | 2025.02.04 |
Java | 힙(Heap)과 스택(Stack) 메모리 (0) | 2025.02.03 |
Java 병렬 스트림(Parallel Stream) 사용 시 예상되는 문제와 해결 방법 (0) | 2025.02.03 |
JAVA | var 이란? (0) | 2024.12.22 |