互斥锁(Mutex)
- 应用场景:当需要保护共享资源,确保同一时间只有一个 goroutine 能够访问该资源时,使用互斥锁。适用于读写操作都需要独占访问共享资源的场景,比如对共享变量的修改。
- 代码示例:
package main
import (
"fmt"
"sync"
)
var (
counter int
mu sync.Mutex
)
func increment(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println("Final counter value:", counter)
}
读写锁(RWMutex)
- 应用场景:当对共享资源的读操作远远多于写操作时,使用读写锁。它允许同一时间有多个 goroutine 进行读操作,但写操作时需要独占访问,以确保数据一致性。
- 代码示例:
package main
import (
"fmt"
"sync"
)
var (
data int
rwMutex sync.RWMutex
)
func read(wg *sync.WaitGroup) {
defer wg.Done()
rwMutex.RLock()
fmt.Println("Read value:", data)
rwMutex.RUnlock()
}
func write(wg *sync.WaitGroup) {
defer wg.Done()
rwMutex.Lock()
data++
fmt.Println("Write value:", data)
rwMutex.Unlock()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go read(&wg)
}
for i := 0; i < 2; i++ {
wg.Add(1)
go write(&wg)
}
wg.Wait()
}