Ketidakbolehubahan Rentetan dan Konkurensi
Soalan:
Adakah kita perlu menyegerakkan penulisan kepada rentetan? Memandangkan rentetan tidak boleh diubah, bukankah kami dijamin keadaan yang konsisten antara membaca dan menulis daripada berbilang urutan?
Jawapan:
Nilai rentetan dalam Go sememangnya tidak berubah, bermakna kandungan mereka tidak boleh diubah suai setelah dibuat. Walau bagaimanapun, kebolehubahan ini hanya terpakai pada nilai rentetan itu sendiri, bukan pada pembolehubah yang memegang rentetan.
Pembolehubah boleh berubah dan boleh menunjuk kepada nilai rentetan yang berbeza dari semasa ke semasa. Jika berbilang goroutine mengakses pembolehubah rentetan secara serentak, dan sekurang-kurangnya satu daripada mereka menulis kepadanya, penyegerakan diperlukan. Ini memastikan bahawa penulisan kepada pembolehubah dilakukan secara berurutan, menghalang akses serentak kepada pembolehubah rentetan, bukan nilainya.
Contoh:
Pertimbangkan kod berikut:
<code class="go">var s string = "hello" func writeToString(s string) { s = "goodbye" } func main() { wg := sync.WaitGroup{} const num = 10 for i := 0; i < num; i++ { wg.Add(1) go func(i int) { defer wg.Done() writeToString(s) }(i) } wg.Wait() fmt.Println(s) }</code>
Tanpa penyegerakan, kod ini akan mengakibatkan perlumbaan data kerana berbilang goroutin menulis kepada pembolehubah yang memegang rentetan. Akibatnya, nilai akhir s boleh sama ada "hello" atau "selamat tinggal", bergantung pada goroutine yang mengakses pembolehubah terakhir.
Dengan menggunakan penyegerakan, seperti penyegerakan.Mutex, kami memastikan bahawa hanya satu goroutine boleh menulis kepada pembolehubah pada satu masa, mengekalkan tingkah laku yang diharapkan.
Atas ialah kandungan terperinci Adakah Rentetan Tidak Berubah dalam Go Memerlukan Penyegerakan untuk Tulisan Serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!