【Golang 面试题】每日 3 题(四十)

✍个人博客:Pandaconda-优快云博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

118. Atomic 交换操作实现

此类操作的前缀为 Swap:

func SwapInt32(addr *int32, new int32) (old int32)
func SwapInt64(addr *int64, new int64) (old int64)
func SwapPointer(addr *unsafe.Pointer, new unsafe.Pointer) (old unsafe.Pointer)
func SwapUint32(addr *uint32, new uint32) (old uint32)
func SwapUint64(addr *uint64, new uint64) (old uint64)
func SwapUintptr(addr *uintptr, new uintptr) (old uintptr)

相对于 CAS,明显此类操作更为暴力直接,并不管变量的旧值是否被改变,直接赋予新值然后返回被替换的值。

func swap(addr *int64, newValue int64) {
    atomic.SwapInt64(addr, newValue)
    fmt.Println("swap opts: ", *addr)
}

119. Atomic 存储操作实现

此类操作的前缀为 Store:

func StoreInt32(addr *int32, val int32)
func StoreInt64(addr *int64, val int64)
func StorePointer(addr *unsafe.Pointer, val unsafe.Pointer)
func StoreUint32(addr *uint32, val uint32)
func StoreUint64(addr *uint64, val uint64)
func StoreUintptr(addr *uintptr, val uintptr)
// 特殊类型: Value类型,常用于配置变更
func (v *Value) Store(x interface{})

此类操作确保了写变量的原子性,避免其他操作读到了修改变量过程中的脏数据。

func store(addr *int64, newValue int64) {
    atomic.StoreInt64(addr, newValue)
    fmt.Println("store opts: ", *addr)
}

120. 原子操作和锁的区别

原子操作是一种特殊的操作,它可以在单个 CPU 指令周期内完成对共享变量的读取和修改,从而保证了操作的原子性。在 Go 中,使用 sync/atomic 包提供的原子操作函数可以对共享变量进行原子操作,从而避免了多个 Goroutine 对同一变量进行并发修改时出现的竞争条件问题。原子操作不需要获取锁,因此效率比锁更高,但是只适用于一些简单的操作,比如读取和修改整数类型的变量。

锁是另一种保证并发安全的机制,它可以确保同一时间只有一个 Goroutine 可以访问共享资源。在 Go 中,使用 sync 包提供的锁可以实现互斥访问共享资源的目的。
锁的机制需要获取锁才能对共享变量进行操作,因此效率比原子操作略低。但是锁可以用于任何类型的变量,而不仅仅是整数类型的变量,因此可以用于更复杂的操作。

Go 中的原子操作和锁(Mutex)都是用于实现并发控制的机制,它们的主要区别如下:

1、作用范围

原子操作用于对单个共享变量的读写进行原子性的保障,而锁则用于对一段代码(即临界区)进行互斥访问,保障多个 goroutine 之间对共享资源的访问顺序。

2、并发性

原子操作的实现是通过硬件级别上的指令保证原子性,因此在高并发情况下执行效率较高。而锁则需要在多个 goroutine 之间进行状态切换和内核态和用户态之间的切换,因此在高并发情况下执行效率相对较低。

3、使用场景

原子操作适合于对单个共享变量进行频繁的读写操作,例如计数器等场景。锁则适用于需要对一段临界区进行互斥访问的场景,例如多个 goroutine 对同一数据结构
进行操作时。

4、错误处理

在使用原子操作时,出现错误可能会导致程序崩溃,因此需要仔细地处理错误。而在使用锁时,错误处理相对简单,可以使用 defer 关键字保证锁的正确释放。
综上所述,如果需要对简单的整数类型变量进行原子操作,可以使用原子操作;如果需要对任意类型的变量进行并发安全的操作,应该使用锁。需要根据具体的应用场景选择使用哪种机制,以获得最佳的性能和可靠性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值