sync包详解

Golang的sync包提供了常见的并发编程同步原语,所谓原语是指不可被中断的,具有原子性的程序段。

sync.Mutex

mutex是互斥的意思,sync.Mutex代表互斥锁,代表在共享资源上互斥访问(不可同时访问)。

mutex := &sync.Mutex{}

mutex.Lock()
// Update共享变量 (比如切片,结构体指针等)
mutex.Unlock()

sync.RWMutex

读写锁实现,除了提供LockUnLock方法用做并发写入,还提供了RLockRUnlock方法进行并发读取:

mutex := &sync.RWMutex{}
mutex.Lock()
// Update 共享变量
mutex.Unlock()

mutex.RLock()
// Read 共享变量
mutex.RUnlock()

sync.WaitGroup

sync.WaitGroup拥有一个内部计数器。当计数器等于0时,则Wait()方法会立即返回。否则它将阻塞执行Wait()方法的goroutine直到计数器等于0时为止。

要增加计数器,我们必须使用Add(int)方法。要减少它,我们可以使用Done()(将计数器减1),也可以传递负数给Add方法把计数器减少指定大小,Done()方法底层就是通过Add(-1)实现的。

sync.Once

sync.Once是一个简单而强大的原语,可确保一个函数仅执行一次。在下面的示例中,只有一个goroutine会显示输出消息:

我们使用了Do(func ())方法来指定只能被调用一次的部分。

sync.Map

sync.Map是一个并发版本的Go语言的map,我们可以:

  • 使用Store(interface {},interface {})添加元素。

  • 使用Load(interface {}) interface {}检索元素。

  • 使用Delete(interface {})删除元素。

  • 使用LoadOrStore(interface {},interface {}) (interface {},bool)检索或添加之前不存在的元素。如果键之前在map中存在,则返回的布尔值为true

  • 使用Range遍历元素。

最后更新于

这有帮助吗?