Go語言中的互斥鎖(Mutex)是一種用于保護共享資源的同步機制。它可以幫助你在多個goroutine之間實現互斥訪問,從而避免數據競爭和不一致的問題。除了互斥鎖之外,Go語言還提供了其他一些同步機制,如讀寫鎖、通道(Channel)和原子操作(Atomic Operations)。下面是關于這些同步機制的簡要介紹:
sync
包提供了Mutex
結構體和相關的方法,如Lock()
、Unlock()
等。使用互斥鎖時,需要注意避免死鎖,確保在適當的時機釋放鎖。package main
import (
"fmt"
"sync"
)
var counter int
var lock sync.Mutex
func increment() {
lock.Lock()
counter++
lock.Unlock()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
increment()
}()
}
wg.Wait()
fmt.Println("Counter:", counter)
}
sync
包提供了RWMutex
結構體和相關的方法,如RLock()
、RUnlock()
、Lock()
和Unlock()
。package main
import (
"fmt"
"sync"
)
var data map[string]string
var rwLock sync.RWMutex
func readData(key string) string {
rwLock.RLock()
defer rwLock.RUnlock()
return data[key]
}
func writeData(key, value string) {
rwLock.Lock()
defer rwLock.Unlock()
data[key] = value
}
func main() {
data = make(map[string]string)
var wg sync.WaitGroup
// 寫入數據
wg.Add(1)
go func() {
defer wg.Done()
writeData("key", "value")
}()
// 讀取數據
wg.Add(1)
go func() {
defer wg.Done()
fmt.Println("Data:", readData("key"))
}()
wg.Wait()
}
package main
import (
"fmt"
"sync"
)
func worker(wg *sync.WaitGroup, ch chan int) {
defer wg.Done()
ch <- 1
}
func main() {
var wg sync.WaitGroup
ch := make(chan int)
wg.Add(1)
go worker(&wg, ch)
<-ch
wg.Wait()
}
sync/atomic
包提供了一些原子操作函數,如AddInt32()
、CompareAndSwapInt32()
等。package main
import (
"fmt"
"sync/atomic"
)
var counter int32
func increment() {
atomic.AddInt32(&counter, 1)
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 1000; i++ {
wg.Add(1)
go func() {
defer wg.Done()
increment()
}()
}
wg.Wait()
fmt.Println("Counter:", counter)
}
總之,Go語言提供了多種同步機制,可以根據不同的場景和需求選擇合適的同步方式。互斥鎖適用于保護共享資源的場景,讀寫鎖適用于讀多寫少的場景,通道適用于在goroutine之間傳遞數據的場景,而原子操作適用于低級別的同步需求。