Files
bulma/atomic_spinlock.go

51 lines
1.1 KiB
Go

// bulma/atomic_spinlock.go
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
)
// SpinLock 自旋锁结构体(基于atomic.Bool实现)
type SpinLock struct {
flag atomic.Bool // false=未锁定,true=已锁定
}
// Lock 加锁:自旋等待,直到获取锁
func (l *SpinLock) Lock() {
// CAS逻辑:尝试将flag从false改为true,失败则循环重试
for l.flag.CompareAndSwap(false, true) {
// 短暂休眠,避免忙等耗尽CPU(关键优化)
time.Sleep(time.Nanosecond) // 避免忙等耗尽 CPU
}
}
// Unlock 解锁:将flag设为false,释放锁
func (l *SpinLock) Unlock() {
l.flag.Store(false)
}
func main() {
var lock SpinLock
var counter atomic.Int32 // 原子计数器,配合自旋锁使用
var wg sync.WaitGroup
// 10 个 goroutine 争抢自旋锁
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
lock.Lock() // 获取自旋锁
defer lock.Unlock() // 延迟解锁,避免锁泄露
counter.Add(1)
fmt.Printf("Goroutine %d 完成计数\n", id)
}(i)
}
wg.Wait()
fmt.Printf("✅ 最终计数: %d (应为 10)\n", counter.Load())
}