개발 지식

개발 지식

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

페이지 정보

profile_image
영삼이
0건 131회 25-03-28 15:07

본문

✅ 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은 안전해 보이지만
고루틴과 함께 쓸 땐 반드시 동기화가 필요하다.
잊으면 프로그램이 터진다.

댓글목록

등록된 댓글이 없습니다.