登录
首页 >  Golang >  Go教程

Golang并发计数器实现详解

时间:2025-11-28 15:52:12 417浏览 收藏

从现在开始,努力学习吧!本文《Golang并发计数器实现方法》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!

使用sync.Mutex保护共享变量可实现Go并发安全计数器。2. 定义含互斥锁和计数字段的结构体,通过加锁解锁保证读写操作的原子性。3. 示例代码展示Inc和Value方法加锁操作,main函数中多goroutine并发调用并等待完成,确保数据竞争安全。

如何在Golang中实现并发安全计数器_Golang 并发计数器实践

在Go语言中实现并发安全的计数器,关键在于避免多个goroutine同时修改共享变量导致的数据竞争。直接使用普通变量加自增操作(如 i++)在并发场景下是不安全的。要正确实现,必须借助同步机制。

使用 sync.Mutex 保护计数器

最直观的方式是用 sync.Mutex 来保护对计数器的访问,确保同一时间只有一个goroutine能修改值。

  • 定义一个结构体包含计数器数值和互斥锁
  • 每次读写计数器前先加锁,操作完成后解锁

示例代码:

package main

import (
    "fmt"
    "sync"
)

type Counter struct {
    mu    sync.Mutex
    count int
}

func (c *Counter) Inc() {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.count++
}

func (c *Counter) Value() int {
    c.mu.Lock()
    defer c.mu.Unlock()
    return c.count
}

func main() {
    var counter Counter
    var wg sync.WaitGroup

    for i := 0; i 

<h3>使用 sync/atomic 实现无锁计数器</h3>
<p>对于简单的递增操作,推荐使用 <strong>sync/atomic</strong> 包提供的原子操作。它性能更高,且无需锁。</p>
<font face="Courier New">
<ul><li>使用 <strong>atomic.AddInt64</strong> 或 <strong>atomic.LoadInt64</strong> 等函数</li>
  <li>避免了锁开销,适合高并发场景</li>
</ul></font>

<p>示例代码:</p>
<pre class="brush:php;toolbar:false;">package main

import (
    "fmt"
    "sync"
    "sync/atomic"
)

type AtomicCounter struct {
    count int64
}

func (c *AtomicCounter) Inc() {
    atomic.AddInt64(&c.count, 1)
}

func (c *AtomicCounter) Value() int64 {
    return atomic.LoadInt64(&c.count)
}

func main() {
    var counter AtomicCounter
    var wg sync.WaitGroup

    for i := 0; i 

<h3>选择合适的实现方式</h3>
<p>如果只是做递增、递减或读取,优先使用 <strong>atomic</strong>。它的操作是底层硬件支持的原子指令,效率高且不会阻塞goroutine。</p>
<p>当计数器逻辑更复杂(比如需要条件判断后再更新),则使用 <strong>mutex</strong> 更清晰安全。</p>

<p>基本上就这些。掌握这两种方式,就能在Go中稳妥地处理并发计数需求。关键是理解数据竞争的本质,并选择合适工具避免它。</p><p>今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~</p>
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>