使用sync.Mutex或sync/atomic可实现Go并发安全计数器。Mutex通过加锁保护共享变量,适合复杂逻辑;atomic利用CPU原子指令操作int64类型,性能更高,适用于简单增减。两者均需同步读写,避免数据竞争。

在Go语言中实现并发安全的计数器,关键在于避免多个goroutine同时修改共享变量导致的数据竞争。直接使用普通整型变量进行增减操作在高并发场景下会出问题,必须引入同步机制来保障读写安全。
最直观的方式是用sync.Mutex锁定对计数器的访问。每次读取或修改时先加锁,操作完成后再解锁,确保同一时间只有一个goroutine能操作该变量。
示例代码:
type Counter struct {
mu sync.Mutex
count int64
}
func (c *Counter) Inc() {
c.mu.Lock()
defer c.mu.Unlock()
c.count++
}
func (c *Counter) Value() int64 {
c.mu.Lock()
defer c.mu.Unlock()
return c.count
}
这种方法逻辑清晰,适合需要复杂操作的场景,但频繁加锁可能影响性能。
立即学习“go语言免费学习笔记(深入)”;
对于简单的递增、递减或读取操作,推荐使用sync/atomic包提供的原子函数。它们底层依赖CPU级别的原子指令,效率更高,且无需显式加锁。
示例代码:
type AtomicCounter struct {
count int64
}
func (a *AtomicCounter) Inc() {
atomic.AddInt64(&a.count, 1)
}
func (a *AtomicCounter) Value() int64 {
return atomic.LoadInt64(&a.count)
}
注意:所有操作都作用于int64类型,并且变量地址应保证64位对齐(结构体中放在首位即可)。
如果只是做简单的数值增减和读取,优先使用atomic。它更轻量、性能更好,也更容易避免死锁等问题。
当计数器需要与其他状态联动,比如条件判断后才决定是否增加,或者涉及多个变量的协调修改,那么使用Mutex更合适,因为它能保护一段逻辑的整体性。
基本上就这些。不复杂但容易忽略的是:即使只读操作,在并发下也需同步,否则可能读到中间状态。用atomic.Load或加锁都是必要手段。
以上就是Golang如何实现并发安全的计数器_Golang并发计数器实现技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号