Go map은 쓰레드 세이프하지 않다
페이지 정보

영삼이
본문
✅ map은 쓰레드 세이프하지 않다
여러 고루틴에서 동시에 접근하면 패닉난다
Go의 내장 map
타입은 동시성 제어가 없다:
m := make(map[string]int)
go func() { m["a"] = 1 }()
go func() { fmt.Println(m["a"]) }()
❌ 문제 상황
-
여러 고루틴이 동시에 읽고 쓰면
-
runtime error: concurrent map read and map write
-
패닉 발생
-
재현은 랜덤하게, 디버깅 어려움
✅ 해결 1: sync.Mutex
로 수동 락 처리
var mu sync.Mutex
mu.Lock()
m["a"] = 1
mu.Unlock()
✅ 해결 2: sync.Map
사용
var sm sync.Map
sm.Store("a", 1)
v, _ := sm.Load("a")
-
동시 접근에 안전
-
단, 일반 map보다 느릴 수 있음
-
읽기 많은 환경에서 유리
✔️ map은 안전해 보이지만
고루틴과 함께 쓸 땐 반드시 동기화가 필요하다.
잊으면 프로그램이 터진다.
- 이전글init 함수 남발은 코드 흐름을 망친다 25.03.28
- 다음글context 없이 만든 서버는 언젠가 고장난다 25.03.28
댓글목록
등록된 댓글이 없습니다.