Go는 기능적 동시 프로그래밍에서 뮤텍스 잠금(Mutex), 읽기-쓰기 잠금(RWMutex) 및 일회성 잠금(Once)의 세 가지 잠금 유형을 제공합니다. 뮤텍스 잠금은 배타적 액세스를 보장하고, 읽기-쓰기 잠금은 동시 읽기와 단일 쓰기를 허용하며, 일회성 잠금은 코드 블록이 한 번만 실행되도록 보장합니다. 이러한 잠금은 공유 리소스에 대한 액세스를 조정하고 데이터 경합을 방지하는 데 사용됩니다. 실제로 뮤텍스는 동시 웹 서비스의 데이터 일관성을 보장하여 동시 요청이 공유 데이터 구조를 동시에 수정하는 것을 방지합니다.
Go 기능적 동시 프로그래밍에서 잠금은 공유 리소스에 대한 액세스를 조정하고 데이터 경쟁을 방지하는 데 사용되는 동기화 메커니즘입니다. Go는 각각 서로 다른 특성과 적용 가능한 시나리오를 가진 여러 유형의 잠금을 제공합니다.
Mutex는 하나의 고루틴만 동시에 리소스를 얻을 수 있도록 허용하는 기본 잠금입니다. 공유 리소스에 대한 독점적인 액세스를 보장합니다.
import ( "sync" "fmt" ) var ( mu sync.Mutex counter int ) func main() { for i := 0; i < 1000; i++ { go func() { mu.Lock() counter++ mu.Unlock() }() } fmt.Println("Final counter value:", counter) }
읽기-쓰기 잠금(RWMutex)을 사용하면 여러 고루틴이 공유 리소스를 동시에 읽을 수 있지만 동시에 하나의 고루틴만 리소스를 쓸 수 있습니다.
import ( "sync" "fmt" ) var ( rwmu sync.RWMutex shared []int ) func main() { // 多个 goroutine 并发读取共享切片 for i := 0; i < 1000; i++ { go func() { rwmu.RLock() fmt.Println("Read:", shared) rwmu.RUnlock() }() } // 单独的 goroutine 写入共享切片 go func() { rwmu.Lock() shared = append(shared, 1, 2, 3) rwmu.Unlock() }() }
Once는 특정 코드 블록이 한 번만 실행되도록 하는 데 사용되는 일회성 잠금입니다.
import ( "sync" "fmt" ) var ( initOnce sync.Once inited = false ) func initialize() { inited = true fmt.Println("Initialized") } func main() { initOnce.Do(initialize) if inited { fmt.Println("Already initialized") } else { fmt.Println("Not initialized") } }
동일한 공유 데이터 구조에서 여러 동시 요청이 작동해야 하는 웹 서비스가 있다고 가정해 보겠습니다. 데이터 일관성을 보장하기 위해 뮤텍스 잠금을 사용하여 데이터 구조를 보호하고 동시 요청이 동시에 수정하는 것을 방지할 수 있습니다.
import ( "sync" "net/http" ) var ( mu sync.Mutex clients map[string]*http.Client ) func main() { http.HandleFunc("/addClient", func(w http.ResponseWriter, r *http.Request) { mu.Lock() clients[r.FormValue("name")] = &http.Client{} mu.Unlock() }) }
이 예에서 지도에 대한 뮤텍스 mu
保护对 clients
동시 액세스를 사용하면 단 하나의 요청만 동시에 고객 정보를 추가하거나 수정할 수 있으므로 데이터 경합을 피할 수 있습니다.
위 내용은 Golang 함수 동시 프로그래밍의 잠금 유형 및 사용법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!