락(lock)이란?
동시접근으로 인한 데이터 오염(Race Condition) 방지가 주 목적
예로 은행 계좌에서 잔액을 1증가시키는 코드를 생각해보자
int balance = 0;
void increment() {
balance = balance + 1; // 3단계 과정으로 쪼개짐
}
// 1. balance 값을 읽는다 (0)
// 2. 1을 더한다. (0 + 1 = 1)
// 3. 결과를 balance에 저장한다.
두 스레드가 동시에 increment()를 호출하면
스레드 A : balance 읽음 (0)
스레드 B : balance 읽음 (0) < A가 아직 저장 안 한 상태에서 B도 읽어버림!
스레드 A : 0 + 1 = 1 계산, balance에 저장 (balance = 1)
스레드 B : 0 + 1 = 1 계산, balance에 저장 (balance = 1)
결과 : balance = 1 (원래는 2가 되어야 하는데, 값이 하나 사라짐)
락(lock)으로 해결하는 방법
락은 "지금 이 자원을 누가 쓰고 있으면, 다른 스레드는 그 사람이 다 쓸 때까지 기다려라"는 규칙
스레드 A : 락 획득 > balance 읽고, 더하고, 저장 > 락 반납
스레드 B : (A가 락 갖고 있는 동안) 대기...
스레드 B : 락 획득 > balance 읽고, 더하고, 저장 > 락 반납
결과 : balance. = 2
교착상태(Deadlock)란?
락을 사용하다가 생길 수 있는 부작용으로, 락 두 개 이상을 서로 다른 순서로 잡으려다가, 서로가 서로를 무한정 기다리게 되는 상황
스레드 A : 락1을 잡음 > 락2를 기다림
스레드 B : 락2를 잡음 > 락1을 기다림
> A는 B가 락 2를 놓기를 기다리고,
B는 A가 락1을 놓기를 기다리고,
서로 영원히 대기... (교착상태)
즉
- 락(Lock)의 목적 = 동시 접근으로 인한 데이터 오염(Race condition) 방지
- 교착상태(Deadlock) = 락을 여러 개 잘못 쓰면 생길 수 있는 부작용/문제점 (락이 막아주는게 아니라, 락 때문에 생길 수 있는 위험)
정리
| 용어 | 의미 |
| Race Condition | 락이 없어서 여러 스레드가 동시에 값을 건드려 데이터가 꼬이는 문제 > 락으로 해결 |
| Lock (락) | "한 번에 하나의 스레드만 접근 가능"하게 막는 장치 > race condition 방지가 목적 |
| Deadlock (교착상태) | 락을 여러 개 쓰다가 서로 무한 대기에 빠지는 문제 > 락을 잘못 써서 생기는 부작용 |
'공부 > 자료구조' 카테고리의 다른 글
| 실무에서는 Stack 클래스보다 Deque 인터페이스의 ArrayDeque를 스텍으로 쓰는 게 더 권장? (0) | 2026.08.29 |
|---|---|
| Stack (0) | 2026.08.25 |
| 연결 리스트 (Linked List) (0) | 2026.08.24 |