【笔记】Go语言的异步和锁

前言

Go语言的异步和锁学习笔记

互斥锁

  • 互斥锁与互斥锁互斥

定义锁

1
var lock = sync.Mutex{}
1
var lock = new(sync.Mutex)

上锁

1
lock.Lock()

解锁

1
lock.Unlock()

读写锁

定义锁

1
var lock = sync.RWMutex{}
1
var lock = new(sync.RWMutex)

写锁

  • 写锁与写锁互斥,写锁与读锁也互斥

上锁

1
lock.Lock()

解锁

1
lock.Unlock()

读锁

  • 读锁与读锁不互斥,读锁与写锁互斥

上锁

1
lock.RLock()

解锁

1
lock.RUnlock()

只执行一次

1
2
3
4
var o = &sync.Once{}
o.Do(func() {
...
})

等待执行完成

创建对象

1
var waitGroup = &sync.WaitGroup{}

设置等待次数

1
waitGroup.Add(1)

等待执行完成

1
waitGroup.Wait()

执行完的协程结束等待

1
waitGroup.Done()

并发Map

定义并发Map

1
var m = &sync.Map{}

存数据

1
m.Store("key", "value")

取数据

1
m.Load("key")

读的时候没有就存数据

1
m.LoadOrStore("key", "value")

读完后直接删除数据

1
m.LoadAndDelete("key")

删除数据

1
m.Delete("key")

遍历数据

  • 函数返回true会立即继续遍历,返回false会立即退出遍历
1
2
3
m.Range(func(key, value interface{}) bool {
return true
})

并发池

定义并发池

1
var p = &sync.Pool{}

存数据

1
p.Put(1)

取数据

  • 如果池中有数据,会随机返回一个数据
  • 如果池中没有数据,会返回nil
1
p.Get()

Cond

创建对象

1
var c = sync.NewCond(&sync.Mutex{})

上锁

1
c.L.Lock()

解锁

1
c.L.Unlock()

等待

1
c.Wait()

解除一个等待

1
c.Signal()

解除所有等待

1
c.Broadcast()

完成

参考文献

哔哩哔哩——郭宏志-老郭
哔哩哔哩——go圈里最会写js的奇淼