面试题答案
一键面试主要内存同步原语
- AddInt32:原子性地将delta加到addr指向的int32变量上,并返回新值。用于在并发环境中安全地对int32类型的变量进行加法操作。
- AddInt64:类似AddInt32,不过是针对int64类型,原子性地将delta加到addr指向的int64变量上,并返回新值。
- CompareAndSwapInt32:比较addr指向的int32变量的值是否等于old,如果相等则将其设置为new,并返回是否成功。用于实现乐观锁等并发控制机制。
- CompareAndSwapInt64:与CompareAndSwapInt32类似,针对int64类型。
- LoadInt32:原子性地加载addr指向的int32变量的值。在多线程环境下获取int32变量值时保证数据一致性。
- LoadInt64:类似LoadInt32,加载int64类型的值。
- StoreInt32:原子性地将val值存储到addr指向的int32变量。在多线程环境下设置int32变量值时保证原子性。
- StoreInt64:类似StoreInt32,存储int64类型的值。
并发编程场景示例
package main
import (
"fmt"
"sync"
"sync/atomic"
)
func main() {
var counter int64
var wg sync.WaitGroup
numRoutines := 100
for i := 0; i < numRoutines; i++ {
wg.Add(1)
go func() {
defer wg.Done()
// 使用AddInt64原子性地增加counter
atomic.AddInt64(&counter, 1)
}()
}
wg.Wait()
fmt.Println("Final counter value:", atomic.LoadInt64(&counter))
}
在上述示例中,通过atomic.AddInt64
在多个goroutine中安全地增加counter
变量的值,避免了竞态条件,保证了数据的一致性和原子性。使用atomic.LoadInt64
来原子性地读取最终的counter
值。