面试题答案
一键面试在Go语言中,可以使用sync
包中的工具来保证共享变量在并发读写时的数据一致性。以下是使用sync.Mutex
实现的示例代码:
package main
import (
"fmt"
"sync"
)
// 定义共享变量
var sharedData int
var mu sync.Mutex
// 模拟高并发写操作
func writeData(wg *sync.WaitGroup, value int) {
defer wg.Done()
mu.Lock()
sharedData = value
mu.Unlock()
}
// 模拟高并发读操作
func readData(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
fmt.Printf("Read data: %d\n", sharedData)
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
// 启动多个写操作
for i := 0; i < 5; i++ {
wg.Add(1)
go writeData(&wg, i)
}
// 启动多个读操作
for i := 0; i < 5; i++ {
wg.Add(1)
go readData(&wg)
}
wg.Wait()
}
同步机制说明
sync.Mutex
:这是Go语言中最基本的同步原语,用于保证同一时间只有一个goroutine可以访问共享资源。Lock
方法:调用该方法时,如果锁可用,则获取锁并继续执行;如果锁已被其他goroutine持有,则阻塞当前goroutine,直到锁可用。Unlock
方法:释放锁,允许其他等待的goroutine获取锁。
在上述代码中,通过在读写共享变量sharedData
之前调用mu.Lock()
,在操作完成后调用mu.Unlock()
,确保了在任何时刻只有一个goroutine能够读写sharedData
,从而保证了数据一致性。