### 实现 sync.Mutex 的步骤:
| 步骤 | 描述 |
| ------ | ------ |
| 步骤1 | 定义一个结构体,其中包含需要同步的共享资源 |
| 步骤2 | 使用 sync.Mutex 来保护共享资源的读写操作 |
| 步骤3 | 使用 Lock 和 Unlock 方法来控制对共享资源的访问 |
### 代码示例:
```go
package main
import (
"fmt"
"sync"
)
// 步骤1:定义一个结构体
type Counter struct {
mu sync.Mutex // 步骤2:定义一个 sync.Mutex 作为互斥锁
count int
}
// 步骤3:定义方法来操作共享资源
func (c *Counter) Increment() {
c.mu.Lock() // 加锁
defer c.mu.Unlock() // 延迟解锁,确保即使出现异常也能正常释放锁
c.count++
}
func (c *Counter) Decrement() {
c.mu.Lock()
defer c.mu.Unlock()
c.count--
}
func (c *Counter) GetCount() int {
c.mu.Lock()
defer c.mu.Unlock()
return c.count
}
func main() {
// 创建共享资源
counter := Counter{}
// 并发地对共享资源进行操作
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for i := 0; i < 1000; i++ {
counter.Increment()
}
}()
go func() {
defer wg.Done()
for i := 0; i < 1000; i++ {
counter.Decrement()
}
}()
wg.Wait()
// 输出最终的计数值
fmt.Println("Count:", counter.GetCount())
}
```
在上面的示例中,我们定义了一个 Counter 结构体,其中包含一个 sync.Mutex 类型的字段 mu 和一个 int 类型的计数器 count。通过 Increment 和 Decrement 方法来增加和减少计数器的值,通过 GetCount 方法来获取计数器的当前值。在每个方法中,我们使用 mu.Lock() 来加锁,确保在操作共享资源时不会被其他 goroutine 中断,操作完成后使用 defer mu.Unlock() 来解锁,释放锁资源。
在 main 函数中,我们创建了一个 Counter 类型的实例 counter,并启动了两个 goroutine 分别对计数器进行增加和减少操作,最终输出计数器的值。通过这种方式,我们可以保证在并发情况下对共享资源的安全访问。
希望通过本文的介绍,小白可以更好地理解和掌握 golang 中使用 sync.Mutex 来实现并发控制的方法。祝他在学习和工作中取得更多的进步!