0Pricing
Go Academy · 강의

sync.Mutex와 sync.RWMutex

잠금 및 읽기-쓰기 잠금 패턴

sync.Mutex와 sync.RWMutex은(는) CoddyKit의 무료 Go Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Go Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

뮤텍스가 필요한 이유

여러 고루틴이 변경 가능한 상태를 공유하면 동시에 읽고 쓰는 과정에서 데이터 경쟁이 발생합니다. 뮤텍스는 접근을 직렬화하여 한 번에 하나의 고루틴만 임계 영역에 들어가도록 합니다.

sync.Mutex 기본

공유 상태를 읽거나 쓰기 전에 Lock을 호출하고, 그 후 Unlock을 호출합니다. 함수에서 패닉이 발생하더라도 잠금 해제가 보장되도록 defer를 사용합니다.

var mu sync.Mutex
var counter int

func inc() {
    mu.Lock()
    defer mu.Unlock()
    counter++
}

구조체에 Mutex 내장하기

뮤텍스가 보호하는 구조체 안에 뮤텍스를 내장합니다. 관례적으로 뮤텍스는 보호하는 필드 바로 위에 선언합니다.

type SafeCounter struct {
    mu sync.Mutex
    v  map[string]int
}
func (c *SafeCounter) Inc(key string) {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.v[key]++
}

Mutex를 복사하지 마십시오

Mutex는 처음 사용한 후 복사해서는 안 됩니다. 포인터로 전달하거나 포인터로 전달되는 구조체에 내장합니다. go vet 도구가 복사본을 감지합니다.

sync.RWMutex

sync.RWMutex는 여러 읽기 작업을 동시에 허용하지만 쓰기 작업은 하나만 허용합니다. 읽기가 많고 쓰기가 드문 경우 사용하면 처리량을 높일 수 있습니다.

var rw sync.RWMutex
var data map[string]int

func read(k string) int {
    rw.RLock()
    defer rw.RUnlock()
    return data[k]
}
func write(k string, v int) {
    rw.Lock()
    defer rw.Unlock()
    data[k] = v
}

RLock과 Lock 비교

RLock은 공유 읽기 잠금을 획득하고 Lock은 배타적 쓰기 잠금을 획득합니다. 대기 중인 쓰기 잠금은 새로운 읽기 잠금을 차단하여 쓰기 작업이 계속 밀리는 현상을 방지합니다.

TryLock(Go 1.18 이상)

mu.TryLock()은 현재 잠금이 해제된 경우에만 잠금을 획득하고 불리언 값을 반환합니다. 차단이 허용되지 않을 때 유용합니다.

if mu.TryLock() {
    defer mu.Unlock()
    // critical section
}

교착 상태

고루틴 A가 잠금 1을 보유한 채 잠금 2를 기다리고, 고루틴 B가 잠금 2를 보유한 채 잠금 1을 기다리면 교착 상태가 발생합니다. 항상 같은 순서로 잠금을 획득하고 임계 영역을 짧게 유지합니다.

잠금 세분화 수준

거친 잠금은 이해하기 쉽지만 동시성을 낮춥니다. 세밀한 잠금은 처리량을 높이지만 복잡성과 교착 상태 위험을 증가시킵니다. 먼저 거친 잠금으로 시작하고 프로파일링에서 경합이 나타날 때 최적화합니다.

뮤텍스와 채널 비교

읽기와 쓰기를 수행하는 여러 고루틴이 공유 상태를 보호해야 할 때는 뮤텍스를 사용합니다. 고루틴 사이에서 데이터의 소유권을 전달할 때는 채널을 사용합니다. 채널은 통신에, 뮤텍스는 동기화에 사용합니다.

sync.Locker 인터페이스

sync.Locker는 Lock과 Unlock을 포함하는 인터페이스입니다. Mutex와 RWMutex가 모두 이를 구현하므로 헬퍼 함수가 두 타입 중 어느 것이든 받을 수 있습니다.

빠른 확인

sync.RWMutex는 sync.Mutex 대신 언제 사용해야 합니까?

복습: 뮤텍스와 읽기-쓰기 뮤텍스

핵심 사항:

  • 뮤텍스는 접근을 직렬화하므로 Unlock은 항상 defer로 호출합니다
  • 처음 사용한 뒤에는 뮤텍스를 복사하지 마십시오
  • RWMutex: 여러 리더 OR 하나의 라이터
  • 교착 상태를 피하려면 일관된 순서로 잠금을 획득합니다

자주 묻는 질문

“sync.Mutex와 sync.RWMutex” 강의는 무료인가요?

네 — “sync.Mutex와 sync.RWMutex” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Go Academy 강의 전체를 잠금 해제할 수 있습니다. Go Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“sync.Mutex와 sync.RWMutex”에서 뭘 배우나요?

잠금 및 읽기-쓰기 잠금 패턴 브라우저에서 직접 실행하는 실습 코드로 Go Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Go Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Go Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.

“sync.Mutex와 sync.RWMutex” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Go Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Go Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. sync.Mutex와 sync.RWMutex
  2. sync.WaitGroup
  3. sync.Once와 sync.Map
  4. 경쟁 감지기와 안전한 패턴
← Go Academy(으)로 돌아가기