Rumah > Artikel > pembangunan bahagian belakang > Jenis dan penggunaan kunci dalam fungsi Golang pengaturcaraan serentak
Go menyediakan tiga jenis kunci dalam pengaturcaraan serentak berfungsi: mutex (Mutex), kunci baca-tulis (RWMutex) dan kunci sekali (Sekali). Kunci Mutex menjamin akses eksklusif, kunci baca-tulis membenarkan bacaan serentak dan tulis tunggal, dan kunci sekali memastikan bahawa blok kod dilaksanakan sekali sahaja. Kunci ini digunakan untuk menyelaraskan akses kepada sumber yang dikongsi dan menghalang perlumbaan data. Dalam amalan, mutexes memastikan konsistensi data dalam perkhidmatan web serentak, menghalang permintaan serentak daripada mengubah suai struktur data yang dikongsi secara serentak.
Dalam pengaturcaraan serentak berfungsi Go, kunci ialah mekanisme penyegerakan yang digunakan untuk menyelaraskan akses kepada sumber dikongsi dan menghalang persaingan data. Go menyediakan berbilang jenis kunci, setiap satu dengan ciri yang berbeza dan senario yang berkenaan.
Mutex ialah kunci asas yang hanya boleh membenarkan satu goroutine mendapatkan sumber pada masa yang sama. Ia menjamin akses eksklusif kepada sumber yang dikongsi.
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) }
Kunci baca-tulis (RWMutex) membenarkan berbilang goroutin membaca sumber yang dikongsi secara serentak, tetapi hanya satu goroutine boleh menulis sumber pada masa yang sama.
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 ialah kunci sekali digunakan untuk memastikan blok kod tertentu dilaksanakan sekali sahaja.
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") } }
Andaikan terdapat perkhidmatan web di mana berbilang permintaan serentak perlu beroperasi pada struktur data kongsi yang sama. Untuk memastikan ketekalan data, kunci mutex boleh digunakan untuk melindungi struktur data dan menghalang permintaan serentak daripada mengubah suai pada masa yang sama.
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() }) }
Dalam contoh ini, menggunakan mutex mu
保护对 clients
akses serentak ke peta memastikan hanya satu permintaan boleh menambah atau mengubah suai maklumat pelanggan pada masa yang sama, sekali gus mengelakkan perlumbaan data.
Atas ialah kandungan terperinci Jenis dan penggunaan kunci dalam fungsi Golang pengaturcaraan serentak. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!