golang非阻塞锁的简单实现

吾爱 ·
为什么不用sync.Once?
#2
更多评论
你这个锁效率太低,说是非阻塞锁,但其实你用了两个锁,仍然是阻塞了。仍然执行了一个锁的加锁和解锁操作。 对于这种,应该用原子操作,原子操作是cpu硬件实现的,真正的无阻塞。 实现也很简单: package main import ( "fmt" "sync" "sync/atomic" "time" ) type foo struct { f int32 // 0为解锁状态,1为锁住状态 } func (self *foo) Bong(wg *sync.WaitGroup) { defer wg.Done() //判断是否为0,如果是则更改为1,并返回true,如果不是则不更改,并返回false //判断与更改是原子性操作,由cpu硬件实现,比锁快。 if !atomic.CompareAndSwapInt32(&self.f, 0, 1) { fmt.Println("获取锁失败") return } time.Sleep(time.Second) //停顿一秒 fmt.Println("bong~") //将状态改回0 atomic.StoreInt32(&self.f, 0) } func main() { f := &foo{} wg := &sync.WaitGroup{} wg.Add(4) go f.Bong(wg) go f.Bong(wg) go f.Bong(wg) time.Sleep(time.Second * 2) go f.Bong(wg) wg.Wait() }
#1