设计思路
- 数据结构:定义一个
Counter
结构体,其中包含一个用于存储计数值的字段。
- 并发安全:使用互斥锁(
sync.Mutex
)来保护计数值的读写操作,确保在同一时间只有一个 goroutine 能够修改计数值,从而保证数据的一致性。
- 方法:提供两个方法,一个用于加一操作,另一个用于获取当前计数值。
代码实现
package main
import (
"fmt"
"sync"
)
// Counter 定义计数器结构体
type Counter struct {
value int
mutex sync.Mutex
}
// Increment 增加计数器的值
func (c *Counter) Increment() {
c.mutex.Lock()
c.value++
c.mutex.Unlock()
}
// GetValue 获取计数器当前的值
func (c *Counter) GetValue() int {
c.mutex.Lock()
defer c.mutex.Unlock()
return c.value
}
func main() {
var wg sync.WaitGroup
counter := Counter{}
// 模拟多个 goroutine 并发操作
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
counter.Increment()
}()
}
// 等待所有 goroutine 完成
wg.Wait()
// 获取并打印最终的计数值
fmt.Println("Final counter value:", counter.GetValue())
}