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