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之间传递数据的场景,而原子操作适用于低级别的同步需求。