51 lines
1.1 KiB
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())
|
|
}
|