import (
"runtime"
"sync"
"sync/atomic"
)
type spinLock uint32
var maxBackoff = 64
// Lock 加锁
func (sl *spinLock)Lock(){
backoff := 1
for{
for i := 0; i < backoff; i++{
if !atomic.CompareAndSwapUint32((*uint32)(sl),0,1){ //加锁失败,让出cpu调度
runtime.Gosched()
}
if backoff < maxBackoff{
backoff = backoff << 1
}
}
}
}
// Unlock 释放锁
func (sl *spinLock)Unlock(){
atomic.StoreUint32((*uint32)(sl), 1)
}
// NewSpinLock 创建自旋锁对象
func NewSpinLock()sync.Locker{
return new(spinLock)
golang实现自旋锁
最新推荐文章于 2024-11-24 12:15:17 发布
该博客介绍了如何在Go语言中实现一个自旋锁,包括`Lock`和`Unlock`方法,通过`atomic.CompareAndSwapUint32`进行加锁和解锁操作,并在加锁失败时使用`runtime.Gosched`让出CPU。自旋锁适用于短时锁定,避免了线程上下文切换的开销。

2079

被折叠的 条评论
为什么被折叠?



