Cara Melaksanakan Thread-Safety untuk Pembolehubah dalam Go
Di Java, konsep pembolehubah disegerakkan memastikan bahawa hanya satu utas boleh dilaksanakan blok kod tertentu pada bila-bila masa. Walau bagaimanapun, Go tidak menawarkan kata kunci disegerakkan secara eksplisit.
Rasional
Go mempromosikan pendekatan berbeza untuk penyegerakan rangkaian, berpandukan prinsip: "Jangan berkomunikasi dengan berkongsi ingatan; sebaliknya, kongsi ingatan dengan berkomunikasi." Ini bermakna mengelakkan akses terus kepada memori yang dikongsi dan memilih mekanisme berasaskan komunikasi seperti saluran.
Penyegerakan Berasaskan Mutex
Sekiranya anda menghadapi senario di mana mutex diperlukan , berikut ialah cara untuk melaksanakannya dalam Pergi:
var ( mu sync.Mutex protectMe int ) func getMe() int { mu.Lock() me := protectMe mu.Unlock() return me } func setMe(me int) { mu.Lock() protectMe = me mu.Unlock() }
Penambahbaikan
Penyegerakan Atom
Jika anda perlu melindungi satu nilai, pertimbangkan untuk menggunakan pakej penyegerakan/atom:
var protectMe int32 func getMe() int32 { return atomic.LoadInt32(&protectMe) } func setMe(me int32) { atomic.StoreInt32(&protectMe, me) }
Berasaskan Komunikasi Pendekatan
Go menggalakkan penggunaan saluran untuk komunikasi antara goroutine, menghapuskan keperluan untuk pembolehubah dikongsi. Contohnya, dalam corak penerbit-pelanggan:
type topic struct { subscribing []chan int } var t = &topic{} func subscribe() chan int { ch := make(chan int) t.subscribing = append(t.subscribing, ch) return ch } func publish(v int) { for _, ch := range t.subscribing { ch <- v } }
Pendekatan ini memastikan komunikasi selamat benang tanpa berkongsi memori.
Atas ialah kandungan terperinci Bagaimana untuk Mencapai Keselamatan Benang dalam Go: Mutexes, Atomics, atau Channels?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!