Review:Go语言sync包的应用详解

Review:Go语言sync包和并发控制

来源:

[]: https://mp.weixin.qq.com/s?__biz=MzAxMTA4Njc0OQ==&mid=2651439459&idx=3&sn=b8fcbcc73a4c8a527daa48a7a585ad19&chksm=80bb1f91b7cc9687784e2cf60b137a3b8277488097128715d3d16559bb0188cf8c7d958461c9&mpshare=1&scene=1&srcid=&sharer_sharetime=1588993595774&sharer_shareid=1d575e01c32756716010f121cd2a8677#rd

互斥锁 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)
posted @ 2020-05-29 10:37  飞天小烤猪  阅读(227)  评论(0编辑  收藏  举报