Review:Go语言sync包的应用详解
Review:Go语言sync包和并发控制
来源:
锁
互斥锁 sync.Mutex
mutex := &sync.Mutex{}
mutex.Lock()
mutex.Unlock()
读写锁 sync.RWMutex
除了Mutex的功能,增加了RLock方法。
mutex := &sync.RWMutex{}
mutex.Lock()
mutex.Unlock()
mutex.RLock()
mutex.RUnlock()
同步
等待组 sync.WaitGroup
主要有Add(int) ,Done(),Wait()方法
wg := &sync.WaitGroup{}
for i := 0; i < 4; i++ {
wg.Add(1)
go func() {
wg.Done()
}()
}
wg.Wait()
执行一次 sync.Once
once := &sync.Once{}
for i := 0; i < 4; i++ {
i := i
go func() {
once.Do(func() {
fmt.Printf("first %d\n", i)
})
}()
}
条件变量 sync.Cond
func NewCond(l Locker) *Cond // cond := sync.NewCond(&sync.Mutex{})
func (c *Cond) Broadcast() // Broadcast 唤醒所有等待 c 的Go程。
func (c *Cond) Signal() // Signal 用于唤醒等待 c 的Go程,如果有的话。
func (c *Cond) Wait() // Wait 原子性地解锁 c.L 并挂起调用的Go程的执行。Wait 不会返回,除非它被 Broadcast 或 Signal 唤醒。
池化
池 sync.Pool
主要是Get(), Put(interface{})方法
pool := &sync.Pool{}
pool.Put(NewConnection(1))
pool.Put(NewConnection(2))
pool.Put(NewConnection(3))
connection := pool.Get().(*Connection)
fmt.Printf("%d\n", connection.id)
并发安全对象
同步散列表 sync.Map
m := &sync.Map{}
// 添加元素
m.Store(1, "one")
// 获取元素1
value, ok := m.Load(1)
// 返回已存value,否则把指定的键值存储到map中
value, ok := m.LoadOrStore(3, "three")
// 删除
m.Delete(3)

浙公网安备 33010602011771号