MST

星途 面试题库

面试题:Go协程性能优化之资源管理

在Go中,当多个协程同时访问共享资源时,可能会导致性能问题。请描述一种使用`sync.Mutex`来优化这种场景下协程性能的方法,并给出一个简单示例。
24.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 优化方法描述
    • 使用sync.Mutex来保护共享资源。在协程访问共享资源前,通过调用mutex.Lock()方法获取锁,这样其他协程就无法同时访问该共享资源。当协程完成对共享资源的操作后,调用mutex.Unlock()方法释放锁,允许其他协程获取锁并访问共享资源。这种方式确保同一时间只有一个协程能够访问共享资源,避免数据竞争,从而在一定程度上优化性能(虽然加锁会有一定开销,但相比数据竞争导致的未定义行为等问题,这种开销是可接受的)。
  2. 示例代码
package main

import (
    "fmt"
    "sync"
)

var (
    counter int
    mutex   sync.Mutex
)

func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    mutex.Lock()
    counter++
    mutex.Unlock()
}

func main() {
    var wg sync.WaitGroup
    numRoutines := 1000
    for i := 0; i < numRoutines; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Printf("Final counter value: %d\n", counter)
}

在上述示例中:

  • 定义了一个共享变量counter和一个sync.Mutex类型的mutex
  • increment函数用于对counter进行自增操作。在自增前调用mutex.Lock()获取锁,自增完成后调用mutex.Unlock()释放锁。
  • main函数中,创建了1000个协程同时调用increment函数,通过sync.WaitGroup等待所有协程完成,最后输出counter的最终值。如果不使用sync.Mutex保护counter,由于多个协程同时访问和修改counter,会导致数据竞争,最终的counter值将是不确定的。