发布时间:2024-11-21 22:11:26
Mutex用于保护临界区,只允许一个goroutine访问该区域,其他goroutine必须等待。下面是一个使用Mutex实现的简单示例:
```go import ( "fmt" "sync" ) var ( mu sync.Mutex count int ) func increment() { mu.Lock() defer mu.Unlock() count++ } func main() { wg := sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() increment() }() } wg.Wait() fmt.Println("count:", count) } ``` 上述示例中,我们定义了一个全局变量count,并使用Mutex对其进行保护。每个goroutine调用increment函数时,会先获取锁,然后执行count++操作,最后释放锁。RWMutex用于保护读写操作,并允许多个读操作同时进行,但只允许一个写操作进行。下面是一个使用RWMutex实现的示例:
```go import ( "fmt" "sync" ) var ( mu sync.RWMutex data []int ) func readData() { mu.RLock() defer mu.RUnlock() fmt.Println("data:", data) } func writeData(newData int) { mu.Lock() defer mu.Unlock() data = append(data, newData) } func main() { wg := sync.WaitGroup{} go func() { defer wg.Done() readData() }() for i := 0; i < 10; i++ { wg.Add(1) go func(i int) { defer wg.Done() writeData(i) }(i) } wg.Wait() } ``` 在上述示例中,我们定义了一个全局切片data,并使用RWMutex对其进行保护。readData函数读取数据时,获取读锁,而writeData函数写入数据时需要获取写锁。