Go は、関数型並行プログラミングで、ミューテックス ロック (Mutex)、読み取り/書き込みロック (RWMutex)、およびワンタイム ロック (Once) という 3 つのロック タイプを提供します。ミューテックス ロックは排他的アクセスを保証し、読み取り/書き込みロックは同時読み取りと単一書き込みを許可し、ワンタイム ロックはコード ブロックが 1 回だけ実行されることを保証します。これらのロックは、共有リソースへのアクセスを調整し、データ競合を防ぐために使用されます。実際には、ミューテックスは同時 Web サービス内のデータの一貫性を保証し、同時リクエストが共有データ構造を同時に変更することを防ぎます。
Go 関数型並行プログラミングでは、ロックはデータの共有を防ぐためのリソース アクセスを調整するために使用される同期メカニズムです。レース。 Go は複数の種類のロックを提供しており、それぞれに異なる特性と適用可能なシナリオがあります。
Mutex ロック (Mutex) は、同時に 1 つの goroutine のみがリソースを取得できる基本的なロックです。共有リソースへの排他的アクセスが保証されます。
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) を使用すると、複数の goroutine が共有リソースを同時に読み取ることができますが、同時にリソースに書き込むことができる goroutine は 1 つだけです。
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 は、コードの特定のブロックが 1 回だけ実行されるようにするために使用される 1 回限りのロックです。
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") } }
複数の同時リクエストが同じ共有データ構造上で動作する必要がある Web サービスがあるとします。データの一貫性を確保するために、ミューテックス ロックを使用してデータ構造を保護し、同時リクエストによってデータ構造が同時に変更されるのを防ぐことができます。
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
マップへの同時アクセスを保護し、1 つのリクエストだけで顧客情報を追加または変更できるようにします。同時に実行できるため、データ競合が回避されます。
以上がGolang 関数同時プログラミングにおけるロックの種類と使用法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。