Data Race :两个以上的goroutine,且至少有一个为写操作,即算为线程不安全
因为高并发编程是多个协程共同访问同一块内存,所以要传引用才可以让多个协程的锁对象一致
Mutex
mutex := &sync.Mutex{}
mutex.Lock()
mutex.Unlock()
RWMutex
// 效率: RWMutex.RLock() > Mutex.Lock() > RWMutex.Lock
// 所以一般只有在读多写少的情况下才会使用RWMutex
mutex := &sync.RWMutex{}
mutex.Lock()
mutex.Unlock()
mutex.RLock()
mutex.RUnlock()
WaitGroup
wg := &sync.WaitGroup{}
wg.Add(1)
wg.Done() //底层实现wg.Add(-1)
wg.Wait()
Map
m := &sync.Map{}
m.Store(key,val)
m.Load(key)
m.LoadOrStore(key,value) //有就获取返回true,没有就存储返回FALSE
m.Delete(key)
m.LoadAndDelete(key)
// 迭代所有元素
m.Range(func(key, value interface{}) bool {
fmt.Printf("%d: %s\n", key.(int), value.(string))
return true
})
Once
once := &sync.Once{}
once.Do(func)
Pool
// 并发池
pool := &sync.Pool{}
pool.Put(NewConnection(1))
pool.Get().(*Connection)
Cond
实现一对一,一对多的广播