MST
星途 面试题库

面试题:Go 语言中并发安全的数据结构设计

设计一个并发安全的 `Counter` 数据结构,要求支持多个 goroutine 并发地对其进行加一操作,并能够获取当前的计数值。需要使用 Go 语言的并发原语(如互斥锁、通道等)来保证数据的一致性和并发安全。请详细描述设计思路并给出完整的代码实现。
24.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 数据结构:定义一个 Counter 结构体,其中包含一个用于存储计数值的字段。
  2. 并发安全:使用互斥锁(sync.Mutex)来保护计数值的读写操作,确保在同一时间只有一个 goroutine 能够修改计数值,从而保证数据的一致性。
  3. 方法:提供两个方法,一个用于加一操作,另一个用于获取当前计数值。

代码实现

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())
}