백엔드 면접 용어 사전
운영체제mutex

뮤텍스

임계 구역을 한 스레드만 들어가게 하는 상호 배제 장치. 잠근 주체만 풀 수 있다(소유권 개념).

한 번에 하나만 임계 구역에 들어가게 하는 상호 배제 장치(MUTual EXclusion).

동작

  • 스레드 A: lock() — → 획득 성공, 임계 구역 진입
  • 스레드 B: lock() — → 이미 잠김 → 대기(블로킹, 스레드가 잠든다)
  • 스레드 A: unlock() → 해제
  • 스레드 B: — → 깨어나 획득

세마포어와의 결정적 차이 — 소유권

이것이 면접의 핵심이다.

뮤텍스세마포어
개념잠금신호·카운터
잠김/풀림0 이상의 정수
소유권잠근 스레드만 풀 수 있다아무나 signal 가능
용도자원 보호자원 개수 제한, 순서 제어

소유권이 있다는 것의 실질적 의미

  1. 다른 스레드가 실수로 푸는 사고를 막는다
  2. 우선순위 역전을 해결할 수 있다 — 누가 들고 있는지 알아야 그 스레드의 우선순위를 올려 줄 수 있다(우선순위 상속)
  3. 재진입이 가능하다 — 이미 내가 들고 있으면 다시 획득 가능
synchronized void a() { b(); }      // a를 잡은 채로
synchronized void b() { … }         // b도 잡는다 → 같은 스레드니 통과

재진입이 안 되면 이 코드가 자기 자신과 데드락에 빠진다. 자바 synchronizedReentrantLock은 모두 재진입 가능하다.

자바의 두 가지

// ① synchronized — JVM 내장, 자동 해제
synchronized (lock) { … }   // 예외가 나도 반드시 풀린다

// ② ReentrantLock — 유연하지만 직접 풀어야 한다
lock.lock();
try { … } finally { lock.unlock(); }   // finally 필수!

ReentrantLock이 주는 것

  • tryLock(3, SECONDS)타임아웃을 걸어 무한 대기 회피
  • lockInterruptibly() — 대기 중 인터럽트 가능
  • new ReentrantLock(true)공정 모드(먼저 온 순서 보장, 대신 느림)
  • 여러 개의 Condition

성능 — 자바의 락 최적화

synchronized는 무조건 무겁다는 인식이 있는데, 현대 JVM은 단계적으로 올린다.

  • 편향 락(biased) — → 한 스레드만 쓰면 사실상 비용 0 ※ JDK 15+ 폐기
  • 경량 락(thin) — → 경쟁이 짧으면 CAS 스핀으로 처리
  • 중량 락(fat) — → 경쟁이 길면 OS 뮤텍스로 승격 → 실제 블로킹

중량 락이 되면 컨텍스트 스위칭이 발생해 비용이 급증한다. 그래서 임계 구역을 최대한 짧게 만드는 것이 중요하다.

실무 원칙

  • 임계 구역 안에서 외부 API 호출·파일 I/O 금지 (락을 오래 쥔다)
  • 락을 여러 개 잡을 때는 항상 같은 순서로 (데드락 회피)
  • 가능하면 락 대신 AtomicInteger·ConcurrentHashMap 같은 논블로킹 자료구조를 쓴다

함께 보면 좋은 용어

노트에서 맥락과 함께 보기 — 운영체제 — 프로세스/스레드·동기화·가상메모리