// 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()) }